دعونا نواصل دراستنا للتعبيرات العادية. في هذه المقالة سنلقي نظرة على فئات الأحرف المحددة مسبقًا بالإضافة إلى القياس الكمي (البحث عن التسلسلات).
فئات الأحرف المحددة مسبقًا
تحتوي فئة APIPattern
على فئات أحرف محددة مسبقًا توفر اختصارات مناسبة للتعبيرات العادية شائعة الاستخدام. في هذا الجدول، تعتبر التركيبات الموجودة في العمود الأيسر تمثيلات مختصرة للتعبيرات الموجودة في العمود الأيمن. على سبيل المثال، \d
تعني رقمًا (0-9)، \w
وتعني أي حرف كبير أو صغير، أو شرطة سفلية أو رقم). استخدم فئات الأحرف المحددة مسبقًا كلما أمكن ذلك. سيؤدي ذلك إلى تسهيل قراءة التعليمات البرمجية الخاصة بك وإصلاح الأخطاء. تسمى البنيات التي تبدأ بشرطة مائلة عكسية هروب أو محمية. لقد تحدثنا بالفعل في المقالات السابقة عن الهروب من الأحرف الخاصة ذات الخطوط المائلة العكسية أو الرموز \Q
واستخدامها \E
كأحرف عادية. إذا كنت تستخدم شرطة مائلة عكسية بأحرف عادية (أحرف حرفية)، فستحتاج إلى الهروب من الشرطة المائلة العكسية لتجميع التعبير.
private final String REGEX = "\\d"; // цифра
في هذا المثال \d
، تعبير عادي؛ الخط المائل العكسي الإضافي ضروري لتجميع البرنامج. يقرأ برنامج الاختبار الخاص بنا التعبيرات العادية مباشرةً من وحدة التحكم، لذلك لا حاجة إلى شرطة مائلة إضافية. يوضح المثال التالي استخدام فئات الأحرف المحددة مسبقًا: في الأمثلة الثلاثة الأولى، التعبير العادي هو ببساطة " .
" (الحرف الخاص بالنقطة)، وهو ما يعني أي حرف. ولذلك كان البحث ناجحاً في جميع الحالات. تستخدم الأمثلة الأخرى فئات أحرف محددة مسبقًا، والتي ناقشنا معانيها في الجدول أعلاه.
محددو الكمية
تتيح لك محددات الكمية تحديد عدد مرات ظهور الحرف في السلسلة. دعونا نلقي نظرة فاحصة على تعقيدات كيفية عمل أجهزة قياس الكميات الجشعة والكسولة والجشعة للغاية. للوهلة الأولى قد يبدو أن المحددات الكمية X؟؟، X؟؟ وX?+ يعملان بنفس الطريقة: "X موجود مرة واحدة أو لا يكون موجودًا على الإطلاق." هناك اختلافات طفيفة في تنفيذ هذه المحددات، والتي سننظر إليها أدناه.تطابقات ذات طول صفري
لنبدأ بالجشع. لنكتب ثلاثة تعبيرات عادية مختلفة: الحرف "a" بأحرف خاصة؟ أو * أو +. دعونا نرى ماذا سيحدث إذا اختبرنا هذه التعبيرات العادية على سطر فارغ: في المثال أعلاه، كان البحث ناجحًا في الحالتين الأوليين، لأن التعبيرات أ؟ و* السماح للحرف a بأن يكون مفقودًا من السلسلة. لاحظ أيضًا أن فهرس البداية والمطابقة الأخيرة متماثلان (0). نظرًا لأن سلسلة الإدخال ليس لها طول، فلن يجد البرنامج شيئًا :) في الموضع الأول. تسمى هذه الحالة بمطابقة ذات طول صفري. تحدث مثل هذه التطابقات في عدة حالات: عندما يكون سطر الإدخال فارغًا، أو في بداية سطر الإدخال، أو بعد الحرف الأخير من السطر، أو بين الأحرف في السطر. من السهل اكتشاف التطابقات ذات الطول الصفري: فهي تبدأ وتنتهي في نفس الموضع. دعونا نلقي نظرة على بعض الأمثلة الإضافية للمطابقات ذات الطول الصفري. دعنا نستكشف التطابقات ذات الطول الصفري مع بعض الأمثلة الإضافية. دعونا نغير سلسلة الإدخال إلى الحرف "a" ونلاحظ تأثيرًا مثيرًا للاهتمام: وجدت جميع محددات الكمية الثلاثة الحرف "a"، لكن الأولين، اللذين يسمحان بغياب الحرف، وجدا تطابقًا بطول صفري في الموضع 1 - بعد الحرف الأخير من السلسلة. يحدث هذا لأن البرنامج يعامل الحرف "a" كسلسلة و"يعمل" من خلاله حتى لا يكون هناك المزيد من التطابقات. اعتمادًا على المُحدِّد الكمي المستخدم، سيجد البرنامج أو لن يجد "لا شيء" في نهاية السلسلة. الآن دعنا نغير سلسلة الإدخال إلى سلسلة من خمسة أحرف "a": التعبير العادي أ؟ يجد تطابقًا لكل حرف في السلسلة بشكل منفصل. يعثر التعبير a* على مطابقتين: تسلسل الأحرف "a"' ومطابقة ذات طول صفري في الموضع 5. وأخيرًا، يبحث التعبير العادي a+ عن تسلسل الأحرف "a" فقط، دون العثور على "لا شيء" :) ماذا سيحدث إذا تم إدخال سلسلة تحتوي على أحرف مختلفة كمدخل؟ على سبيل المثال، "ababaaaab": الحرف "b" موجود في المواضع 1 و3 و8 ويبحث البرنامج عن تطابقات ذات طول صفري في هذه المواضع. التعبير العادي أ؟ لا ينتبه إلى "b"، ولكنه ببساطة يبحث عن وجود (أو غياب) الحرف "a". إذا سمح محدد الكمية بغياب "a"، فسيتم عرض جميع الأحرف في السلسلة بخلاف "a" كتطابق بطول صفري. للعثور على تسلسلات بطول معين، ما عليك سوى تحديد الطول بين قوسين متعرجين: يبحث التعبير العادي a{3} عن تسلسل مكون من ثلاثة أحرف "a". لم يتم العثور على شيء في السطر الأول لأنه لم يكن هناك ما يكفي من الحروف في السطر. والثاني يحتوي على 3 أحرف يجدها البرنامج. الاختبار الثالث أيضًا يعثر على تطابق في بداية السلسلة. كل شيء بعد الحرف الثالث لا يفي بالتعبير العادي، في الكود أدناه، سيكون هناك عدة مطابقات: لتحديد الحد الأدنى لطول التسلسل، استخدم: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". وأخيرًا، تحديد الحد الأقصى لطول التسلسل: في هذا المثال، انتهت المطابقة الأولى عند الحرف السادس. المباراة الثانية تحتوي على أحرف بعد السادسة، لأن أنها تلبي الحد الأدنى من متطلبات الطول. إذا كانت السلسلة أقصر بحرف واحد، فلن يكون هناك تطابق ثانٍ.
GO TO FULL VERSION