كيفية تقسيم سلسلة نصية في Java: دليل شامل للمبتدئين والمحترفين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

«ساعدوني، لا أستطيع تقسيم السلسلة النصية!» — قصة مشكلة واحدة

\n\n

تخيل: أنت تكتب محللاً لسجلات (logs) بلغة Java، أو تعالج ملف CSV، أو تريد ببساطة تقسيم إدخال المستخدم إلى كلمات. وفجأة — توقف. كيف تفعل ذلك؟ إذا كنت قد بحثت يومًا عن «How do I split a string in Java»، فأنت تعلم: هذا السؤال على Stack Overflow جمع مئات الآلاف من المشاهدات. ليس لأن مبرمجي Java كسالى، بل لأن split() أداة قوية، ولكنها محفوفة بالمزالق.

\n\n

في هذه المقالة، سنشرح تقسيم السلاسل النصية في Java من الألف إلى الياء. ستتعلم كيف تعمل طريقة split()، وما المفاجآت التي تخبئها التعبيرات المنتظمة، وكيف تتجنب الأخطاء التي تنتظر كل مبتدئ ثانٍ. هيا بنا!

\n\n

طريقة split(): أداتك الرئيسية

\n\n

تقدم فئة String في Java صيغتين محملتين بشكل زائد لطريقة split():

\n\n
public String[] split(String regex)\npublic String[] split(String regex, int limit)
\n\n

الصيغة الأولى تقبل تعبيرًا منتظمًا وتعيد مصفوفة من السلاسل النصية. الثانية — نفس الشيء، ولكن مع حد لعدد الأجزاء. يبدو الأمر بسيطًا؟ دعنا نلقي نظرة على الأمثلة.

\n\n

مثال أساسي: التقسيم حسب المسافة

\n\n
public 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

الإخراج:

\n
Java\nتقسم\nالسلاسل\nالنصية\nبسهولة
\n\n

هل يعمل؟ يعمل. ولكن ماذا لو كان لديك عدة مسافات متتالية؟ عندها ستدخل سلاسل نصية فارغة إلى المصفوفة. أمر مزعج، أليس كذلك؟

\n\n

تقسيم سلسلة نصية في Java حسب الفاصلة (CSV)

\n\n

واحدة من أكثر المهام شيوعًا — تقسيم سلسلة نصية في Java حسب الفاصلة. لنفترض أن لديك سلسلة CSV:

\n\n
String 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

التعبيرات المنتظمة: السحر والألم

\n\n

تقبل طريقة split() تعبيرًا منتظمًا. هذا يمنح مرونة هائلة، لكنه يتطلب دقة. دعنا نستعرض السيناريوهات الشائعة.

\n\n

التقسيم حسب النقطة

\n\n

هل تريد تقسيم عنوان IP "192.168.1.1"؟ الكود الساذج str.split(".") لن يعمل. لماذا؟ لأن النقطة في التعبيرات المنتظمة هي رمز خاص يعني «أي حرف». ونتيجة لذلك، ستحصل على مصفوفة من السلاسل الفارغة.

\n\n

الحل الصحيح — هو إفلات (escape) النقطة:

\n\n
String 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\n

ماذا تفعل إذا كانت السلسلة النصية تحتوي على فواصل وفواصل منقوطة ومسافات؟ استخدم فئة الرموز بين قوسين مربعين:

\n\n
String messy = "تفاح;كمثرى,موز برتقال";\nString[] items = messy.split("[;,\\\\s]+"); // ; أو , أو رموز المسافات\n\nfor (String item : items) {\n    System.out.println(item);\n}\n// الإخراج: تفاح كمثرى موز برتقال
\n\n

العلامة + تعني «واحد أو أكثر» — وهذا يضمن أن تسلسل الفواصل لا ي

المدونات

توصيات الكتب