JavaRush /مدونة جافا /Random-AR /أساسيات التعبيرات العادية في جافا. الجزء 3
articles
مستوى

أساسيات التعبيرات العادية في جافا. الجزء 3

نشرت في المجموعة
دعونا نواصل دراستنا للتعبيرات العادية. في هذه المقالة سنلقي نظرة على فئات الأحرف المحددة مسبقًا بالإضافة إلى القياس الكمي (البحث عن التسلسلات). أساسيات التعبيرات العادية في جافا.  الجزء 3 - 1

فئات الأحرف المحددة مسبقًا

تحتوي فئة API Patternعلى فئات أحرف محددة مسبقًا توفر اختصارات مناسبة للتعبيرات العادية شائعة الاستخدام. أساسيات التعبيرات العادية في جافا.  الجزء 3 - 2في هذا الجدول، تعتبر التركيبات الموجودة في العمود الأيسر تمثيلات مختصرة للتعبيرات الموجودة في العمود الأيمن. على سبيل المثال، \dتعني رقمًا (0-9)، \wوتعني أي حرف كبير أو صغير، أو شرطة سفلية أو رقم). استخدم فئات الأحرف المحددة مسبقًا كلما أمكن ذلك. سيؤدي ذلك إلى تسهيل قراءة التعليمات البرمجية الخاصة بك وإصلاح الأخطاء. تسمى البنيات التي تبدأ بشرطة مائلة عكسية هروب أو محمية. لقد تحدثنا بالفعل في المقالات السابقة عن الهروب من الأحرف الخاصة ذات الخطوط المائلة العكسية أو الرموز \Qواستخدامها \Eكأحرف عادية. إذا كنت تستخدم شرطة مائلة عكسية بأحرف عادية (أحرف حرفية)، فستحتاج إلى الهروب من الشرطة المائلة العكسية لتجميع التعبير.
private final String REGEX = "\\d"; // цифра
في هذا المثال \d، تعبير عادي؛ الخط المائل العكسي الإضافي ضروري لتجميع البرنامج. يقرأ برنامج الاختبار الخاص بنا التعبيرات العادية مباشرةً من وحدة التحكم، لذلك لا حاجة إلى شرطة مائلة إضافية. يوضح المثال التالي استخدام فئات الأحرف المحددة مسبقًا: أساسيات التعبيرات العادية في جافا.  الجزء 3 - 3أساسيات التعبيرات العادية في جافا.  الجزء 3 - 4في الأمثلة الثلاثة الأولى، التعبير العادي هو ببساطة " ." (الحرف الخاص بالنقطة)، وهو ما يعني أي حرف. ولذلك كان البحث ناجحاً في جميع الحالات. تستخدم الأمثلة الأخرى فئات أحرف محددة مسبقًا، والتي ناقشنا معانيها في الجدول أعلاه.

محددو الكمية

أساسيات التعبيرات العادية في جافا.  الجزء 3 - 4تتيح لك محددات الكمية تحديد عدد مرات ظهور الحرف في السلسلة. دعونا نلقي نظرة فاحصة على تعقيدات كيفية عمل أجهزة قياس الكميات الجشعة والكسولة والجشعة للغاية. للوهلة الأولى قد يبدو أن المحددات الكمية X؟؟، X؟؟ وX?+ يعملان بنفس الطريقة: "X موجود مرة واحدة أو لا يكون موجودًا على الإطلاق." هناك اختلافات طفيفة في تنفيذ هذه المحددات، والتي سننظر إليها أدناه.

تطابقات ذات طول صفري

لنبدأ بالجشع. لنكتب ثلاثة تعبيرات عادية مختلفة: الحرف "a" بأحرف خاصة؟ أو * أو +. دعونا نرى ماذا سيحدث إذا اختبرنا هذه التعبيرات العادية على سطر فارغ: أساسيات التعبيرات العادية في جافا.  الجزء 3 - 5في المثال أعلاه، كان البحث ناجحًا في الحالتين الأوليين، لأن التعبيرات أ؟ و* السماح للحرف a بأن يكون مفقودًا من السلسلة. لاحظ أيضًا أن فهرس البداية والمطابقة الأخيرة متماثلان (0). نظرًا لأن سلسلة الإدخال ليس لها طول، فلن يجد البرنامج شيئًا :) في الموضع الأول. تسمى هذه الحالة بمطابقة ذات طول صفري. تحدث مثل هذه التطابقات في عدة حالات: عندما يكون سطر الإدخال فارغًا، أو في بداية سطر الإدخال، أو بعد الحرف الأخير من السطر، أو بين الأحرف في السطر. من السهل اكتشاف التطابقات ذات الطول الصفري: فهي تبدأ وتنتهي في نفس الموضع. دعونا نلقي نظرة على بعض الأمثلة الإضافية للمطابقات ذات الطول الصفري. دعنا نستكشف التطابقات ذات الطول الصفري مع بعض الأمثلة الإضافية. دعونا نغير سلسلة الإدخال إلى الحرف "a" ونلاحظ تأثيرًا مثيرًا للاهتمام: أساسيات التعبيرات العادية في جافا.  الجزء 3 - 6وجدت جميع محددات الكمية الثلاثة الحرف "a"، لكن الأولين، اللذين يسمحان بغياب الحرف، وجدا تطابقًا بطول صفري في الموضع 1 - بعد الحرف الأخير من السلسلة. يحدث هذا لأن البرنامج يعامل الحرف "a" كسلسلة و"يعمل" من خلاله حتى لا يكون هناك المزيد من التطابقات. اعتمادًا على المُحدِّد الكمي المستخدم، سيجد البرنامج أو لن يجد "لا شيء" في نهاية السلسلة. الآن دعنا نغير سلسلة الإدخال إلى سلسلة من خمسة أحرف "a": أساسيات التعبيرات العادية في جافا.  الجزء 3 - 7التعبير العادي أ؟ يجد تطابقًا لكل حرف في السلسلة بشكل منفصل. يعثر التعبير a* على مطابقتين: تسلسل الأحرف "a"' ومطابقة ذات طول صفري في الموضع 5. وأخيرًا، يبحث التعبير العادي a+ عن تسلسل الأحرف "a" فقط، دون العثور على "لا شيء" :) ماذا سيحدث إذا تم إدخال سلسلة تحتوي على أحرف مختلفة كمدخل؟ على سبيل المثال، "ababaaaab": أساسيات التعبيرات العادية في جافا.  الجزء 3 - 8الحرف "b" موجود في المواضع 1 و3 و8 ويبحث البرنامج عن تطابقات ذات طول صفري في هذه المواضع. التعبير العادي أ؟ لا ينتبه إلى "b"، ولكنه ببساطة يبحث عن وجود (أو غياب) الحرف "a". إذا سمح محدد الكمية بغياب "a"، فسيتم عرض جميع الأحرف في السلسلة بخلاف "a" كتطابق بطول صفري. للعثور على تسلسلات بطول معين، ما عليك سوى تحديد الطول بين قوسين متعرجين: أساسيات التعبيرات العادية في جافا.  الجزء 3 - 9يبحث التعبير العادي a{3} عن تسلسل مكون من ثلاثة أحرف "a". لم يتم العثور على شيء في السطر الأول لأنه لم يكن هناك ما يكفي من الحروف في السطر. والثاني يحتوي على 3 أحرف يجدها البرنامج. الاختبار الثالث أيضًا يعثر على تطابق في بداية السلسلة. كل شيء بعد الحرف الثالث لا يفي بالتعبير العادي، في الكود أدناه، سيكون هناك عدة مطابقات: أساسيات التعبيرات العادية في جافا.  الجزء 3 - 10لتحديد الحد الأدنى لطول التسلسل، استخدم:
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
في هذا المثال، يعثر البرنامج على تطابق واحد فقط لأن السلسلة تلبي الحد الأدنى لطول التسلسل وهو (3) أحرف "a". وأخيرًا، تحديد الحد الأقصى لطول التسلسل: أساسيات التعبيرات العادية في جافا.  الجزء 3 - 11في هذا المثال، انتهت المطابقة الأولى عند الحرف السادس. المباراة الثانية تحتوي على أحرف بعد السادسة، لأن أنها تلبي الحد الأدنى من متطلبات الطول. إذا كانت السلسلة أقصر بحرف واحد، فلن يكون هناك تطابق ثانٍ.

استخدام مجموعات الأحرف والفئات مع محددات الكمية

حتى هذه اللحظة، قمنا باختبار محددات الكمية على سلاسل تحتوي على نفس الحرف. لا تنطبق محددات الكمية إلا على حرف واحد، لذا فإن التعبير العادي "abc+" سيطابق السلاسل التي تحتوي على "ab" و"c" مرة واحدة أو أكثر. لن يعني "abc" مرة واحدة أو أكثر. ولكن يمكن استخدام محددات الكمية جنبًا إلى جنب مع المجموعات وفئات الأحرف، مثل [abc]+ (a أو b أو c، مرة واحدة أو أكثر) أو (abc)+ ("abc" مرة واحدة أو أكثر). فلنبحث عن مجموعة من الشخصيات (الكلب)، ثلاث مرات في السطر: أساسيات التعبيرات العادية في جافا.  الجزء 3 - 12في المثال الأول، وجد البرنامج التطابق، لأن يمتد المحدد الكمي إلى مجموعة من الأحرف. إذا قمت بإزالة الأقواس، فسيتم تطبيق محدد الكمية {3} فقط على الحرف "g". يمكنك أيضًا استخدام محددات الكمية مع فئات الأحرف: Основы регулярных выражений в Java. Часть 3 - 13ينطبق محدد الكمية {3} على فئة الأحرف الموجودة بين قوسين في المثال الأول، وفي المثال الثاني - فقط على الحرف "c".

الاختلافات بين مقاييس الجشع والكسل والجشع المفرط

هناك اختلافات طفيفة بين المقاييس الجشعة والمترددة والتملكية. تم تسمية محددات الكمية الجشعة بهذا الاسم لأنها تحاول العثور على أطول تطابق ممكن: يحاول البرنامج أولاً "أكل" السلسلة بأكملها، إذا لم يتم العثور على تطابق، فسيتم تجاهل حرف واحد ويتكرر البحث حتى يتم العثور على تطابق أو لم يبق المزيد من الشخصيات. من ناحية أخرى، يبدأ الأشخاص الكسالى من بداية السطر، ويضيفون حرفًا تلو الآخر حتى يجدوا تطابقًا. أخيرًا، يقوم القياس الكمي الغيور بمسح السلسلة بأكملها مرة واحدة، دون إزالة الأحرف كما هو الحال في الجشع. للتوضيح، سوف نستخدم السلسلة xfooxxxxxxfoo. Основы регулярных выражений в Java. Часть 3 - 14يستخدم المثال الأول المُحدِّد الكمي الجشع .* للعثور على أي حرف، 0 مرة أو أكثر، متبوعًا بالأحرف "f" "o" "o". نظرًا لأن المُصنف جشع، فإن التطابق الذي تم العثور عليه يحتوي على السلسلة بأكملها. لن يجد المُحدِّد الكمي الجشع جميع المطابقات في السلسلة لأنه في الخطوة الأولى، بعد مسح السلسلة بأكملها، ستجد تطابقًا وتنهي المهمة. المثال الثاني كسول ويبدأ من بداية السطر، مضيفًا حرفًا تلو الآخر. يبدأ البرنامج بالتحقق من "الفراغ"، ولكن منذ ذلك الحين التسلسل "foo" ليس في بداية السطر، ويستمر البحث بإضافة الحرف "x"، وبعد ذلك سيتم العثور على التطابق الأول بين الفهرسين 0 و 4. ويستمر البحث حتى نهاية السطر وسيتم العثور على التطابق الثاني بين المؤشرين 4 و 13. والمثال الثالث لا يجد مصادفات لأن مُحدِّد الكمية غيور. في هذه الحالة، التعبير العادي .*+ "أكل" السطر بأكمله، دون ترك أي شيء لـ "foo". استخدم المُحدِّد الكمي الغيور عندما تحتاج إلى التخلص من أي شيء غير ضروري في سلسلة ما، وسيكون أكثر فعالية من المُحدِّد الكمي الجشع المكافئ. هذا كل شئ! رابط إلى المصدر: أساسيات التعبيرات العادية في جافا. الجزء 3
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION