«ساعدوني، لا أستطيع تقسيم السلسلة النصية!» — قصة مشكلة واحدة
\n\nتخيل: أنت تكتب محللاً لسجلات (logs) بلغة Java، أو تعالج ملف CSV، أو تريد ببساطة تقسيم إدخال المستخدم إلى كلمات. وفجأة — توقف. كيف تفعل ذلك؟ إذا كنت قد بحثت يومًا عن «How do I split a string in Java»، فأنت تعلم: هذا السؤال على Stack Overflow جمع مئات الآلاف من المشاهدات. ليس لأن مبرمجي Java كسالى، بل لأن split() أداة قوية، ولكنها محفوفة بالمزالق.
\n\nفي هذه المقالة، سنشرح تقسيم السلاسل النصية في Java من الألف إلى الياء. ستتعلم كيف تعمل طريقة split()، وما المفاجآت التي تخبئها التعبيرات المنتظمة، وكيف تتجنب الأخطاء التي تنتظر كل مبتدئ ثانٍ. هيا بنا!
طريقة split(): أداتك الرئيسية
\n\nتقدم فئة String في Java صيغتين محملتين بشكل زائد لطريقة split():
public String[] split(String regex)\npublic String[] split(String regex, int limit)\n\nالصيغة الأولى تقبل تعبيرًا منتظمًا وتعيد مصفوفة من السلاسل النصية. الثانية — نفس الشيء، ولكن مع حد لعدد الأجزاء. يبدو الأمر بسيطًا؟ دعنا نلقي نظرة على الأمثلة.
\n\nمثال أساسي: التقسيم حسب المسافة
\n\npublic class SplitExample {\n public static void main(String[] args) {\n String text = "Java تقسم السلاسل النصية بسهولة";\n String[] words = text.split(" ");\n \n for (String word : words) {\n System.out.println(word);\n }\n }\n}\n\nالإخراج:
\nJava\nتقسم\nالسلاسل\nالنصية\nبسهولة\n\nهل يعمل؟ يعمل. ولكن ماذا لو كان لديك عدة مسافات متتالية؟ عندها ستدخل سلاسل نصية فارغة إلى المصفوفة. أمر مزعج، أليس كذلك؟
\n\nتقسيم سلسلة نصية في Java حسب الفاصلة (CSV)
\n\nواحدة من أكثر المهام شيوعًا — تقسيم سلسلة نصية في Java حسب الفاصلة. لنفترض أن لديك سلسلة CSV:
\n\nString csv = "تفاح,كمثرى,موز,برتقال";\nString[] fruits = csv.split(",");\n\nfor (String fruit : fruits) {\n System.out.println(fruit.trim()); // trim() يزيل المسافات الزائدة\n}\n\nالإخراج:
\nتفاح\nكمثرى\nموز\nبرتقال\n\nلاحظ: أضفنا trim() لأنه في البيانات الحقيقية غالبًا ما توجد مسافات بعد الفاصلة. بدون ذلك، ستحصل على " تفاح" بمسافة بادئة — وستتساءل بعدها لماذا لا تتطابق السلاسل النصية.
التعبيرات المنتظمة: السحر والألم
\n\nتقبل طريقة split() تعبيرًا منتظمًا. هذا يمنح مرونة هائلة، لكنه يتطلب دقة. دعنا نستعرض السيناريوهات الشائعة.
التقسيم حسب النقطة
\n\nهل تريد تقسيم عنوان IP "192.168.1.1"؟ الكود الساذج str.split(".") لن يعمل. لماذا؟ لأن النقطة في التعبيرات المنتظمة هي رمز خاص يعني «أي حرف». ونتيجة لذلك، ستحصل على مصفوفة من السلاسل الفارغة.
الحل الصحيح — هو إفلات (escape) النقطة:
\n\nString ip = "192.168.1.1";\nString[] parts = ip.split("\\\\."); // شرطتان مقلوبتان مزدوجتان!\n\nfor (String part : parts) {\n System.out.println(part);\n}\n// الإخراج: 192 168 1 1\n\nتذكر: في Java، لإفلات الرموز في التعبيرات المنتظمة، يتم استخدام شرطتين مقلوبتين مزدوجتين \\\\. الشرطة المقلوبة المفردة \\ هي رمز تحكم للسلسلة النصية، بينما المزدوجة مخصصة للتعبير المنتظم.
التقسيم حسب عدة فواصل
\n\nماذا تفعل إذا كانت السلسلة النصية تحتوي على فواصل وفواصل منقوطة ومسافات؟ استخدم فئة الرموز بين قوسين مربعين:
\n\nString messy = "تفاح;كمثرى,موز برتقال";\nString[] items = messy.split("[;,\\\\s]+"); // ; أو , أو رموز المسافات\n\nfor (String item : items) {\n System.out.println(item);\n}\n// الإخراج: تفاح كمثرى موز برتقال\n\nالعلامة + تعني «واحد أو أكثر» — وهذا يضمن أن تسلسل الفواصل لا ي