مقدمة في التعبيرات العادية

مقدمة

بصفتنا مسؤولين نظام ومطورين ومهندسي ضمان الجودة ومهندسي الدعم وما إلى ذلك، نحتاج إلى العثور على نمط معين، مثل مجموعة من عناوين IP التابعة لنطاق معين أو مجموعة من الطوابع الزمنية أو مجموعات من أسماء النطاق أو النطاقات الفرعية، من الملفات. قد نحتاج أيضًا إلى العثور على كلمة مكتوبة بطريقة معينة أو العثور على أخطاء إملائية محتملة في ملف. هنا تأتي التعابير العادية في اللعبة.

التعابير العادية هي قوالب لمطابقة الأنماط (أو في بعض الأحيان عدم مطابقة الأنماط). توفر وسيلة لوصف وتحليل النص. سيقدم هذا البرنامج التعليمي نظرة عامة على التعابير العادية دون الدخول في تفاصيل أي لغة معينة. سنستخدم ببساطة egrep لشرح المفاهيم.

التعابير العادية

التعابير العادية تتألف من نوعين من الأحرف:

  • الأحرف العادية الحرفية و

  • الأحرف الخاصة

هذه الأحرف الميتا التي تمنح القوة للتعبيرات العادية.

اعتبر ملف country.txt التالي حيث العمود الأول هو اسم الدولة، العمود الثاني هو عدد سكان الدولة، والعمود الثالث هو القارة.

$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

أحرف المرجع

المجموعة الأولى من “أحرف المرجع” التي سنناقشها هي ^ و $. ^ و $ تتطابق مع بداية ونهاية نمط على التوالي وتسمى أحرف المرجع.

لمعرفة اسم جميع الدول التي يبدأ اسمها بحرف I، نستخدم التعبير التالي:

$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe

أو لمعرفة جميع الدول التي تنتمي لقارة تنتهي باسم يبدأ بحرف e، نفعل:

$ egrep 'e$' country.txt
Italy,57634327,Europe

الحرف التالي هو النقطة (.)، الذي يتطابق مع حرف واحد. للتطابق مع جميع الأسطر التي يكون اسم الدولة طوله 5 أحرف تمامًا:

$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia

ماذا عن العثور على جميع الأسطر التي تبدأ فيها اسم الدولة بحرف I أو J وطول اسم الدولة 5 أحرف؟

$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

[…] تُسمى مجموعة الأحرف أو فئة الأحرف. داخل مجموعة الأحرف يتم تطابق أحد الأحرف المعطاة فقط.

الرمز ^ داخل مجموعة الأحرف يلغي مجموعة الأحرف. المثال التالي سيتطابق مع أسماء الدول التي يكون طولها خمسة أحرف ولكن لا تبدأ بـ I أو J.

$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia

الرمز المميز للتجميع والبديل

للعثور على جميع الأسطر التي تحتوي على “آسيا” أو “أفريقيا”:

$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

يمكن القيام بذلك أيضًا بأخذ A و a مشتركة.

$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

المقياسات

بدلاً من كتابة

$ egrep '^[IJ]....,' country.txt

يمكننا كتابة

$ egrep '^[IJ].{4},' country.txt

حيث {} تسمى المقياسات. إنها تحدد كم مرة يجب أن يحدث الحرف قبلها.

يمكننا تحديد نطاق أيضًا:

$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

سيتطابق هذا مع أسماء الدول التي تبدأ بـ I أو J وتحتوي على 4 إلى 6 أحرف بعد ذلك.

هناك بعض الاختصارات المتاحة للمقياسات. على سبيل المثال،

{0,1} يعادل ؟

$ egrep '^ab{0,1}c$' filename

يكون نفسه

$ egrep '^ab?c' filename

{0,} يعادل *

$ egrep '^ab{0,}c$' filename

يكون نفسه

$ egrep '^ab*c' filename

{1,} يعادل +

$ egrep '^ab{1,}c$' filename

يكون نفسه

$ egrep '^ab+c' filename

دعنا نرى بعض الأمثلة تتضمن التعابير التي رأيناها حتى الآن. هنا بدلاً من البحث في ملف، نبحث من الإدخال القياسي. الحيلة التي نستخدمها هي أننا نعلم أن أمر grep (أو egrep) يبحث عن نمط، وإذا تم العثور على نمط، فإن السطر بأكمله الذي يحتوي على النمط يظهر.

نرغب في معرفة جميع الطرق الممكنة لتهجئة الجملة كانت البدلة اللون الرمادي مفضلته.

سيكون التعبير كالتالي:

$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite

the gray colour suit was his favorite
the gray colour suit was his favorite

عند النظر إلى التعبير أعلاه، يمكننا رؤية أن:

  • يمكن كتابة اللون الرمادي على أنه grey أو gray

  • يمكن كتابة اللون على أنه colour أو color، مما يعني أن حرف u اختياري لذا نستخدم u؟

  • بالمثل، يمكن كتابة المفضلة على أنها favourite أو favorite باستخدام صيغة favou?rite

ماذا عن مطابقة الرمز البريدي الأمريكي؟

$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456

83456-

834562

92456-1234
92456-1234

10344-2342-345

مثال آخر على مطابقة جميع الأوقات الصالحة في الساعة الـ 24.

$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02

33:45:11

15:45:33
15:45:33

في المثال أعلاه، قلنا إذا كانت الرقم الأول للساعة هو 0 أو 1، فإن الرقم الثاني سيكون أي رقم من 0 إلى 9. ولكن إذا كان الرقم الأول هو 2، فستكون القيم المسموح بها للرقم الثاني هي 0، 1، 2 أو 3.

حدود الكلمة

لكتابة نمط لمطابقة الكلمات التي تنتهي بكلمة color مثل unicolor، watercolor، multicolor وما إلى ذلك.
متطابقة ولكن ليست colorless أو colorful. جرب هذه الأمثلة بنفسك لتتعود عليها:

$ egrep 'color\>'

ثم، لمطابقة colorless وcolorful ولكن ليس unicolor، watercolor، multicolor، إلخ.

$ egrep '\<color'

وبالتالي لمطابقة الكلمة الدقيقة color، نفعل ذلك:

$ egrep '\<color\>'

الإشارات الرجوعية

نفترض أننا نريد أن نطابق جميع الكلمات التي تم كتابتها مرتين، مثل ال ال أو قبل قبل، يجب علينا استخدام الإشارات الرجوعية. تُستخدم الإشارات الرجوعية لتذكر الأنماط.

إليك مثالًا:

$ egrep "\<the\> \1"

أو الطريقة العامة:

$ egrep "\<(.*)\> \1"

يمكن استخدام المثال أعلاه للعثور على جميع الأسماء التي تتكون من اسم واحد يتكرر فيه الاسم الأول والأخير. في حال وجود أكثر من مجموعة واحدة من الأقواس، يمكن الإشارة إلى الثانية، الثالثة، الرابعة إلخ بـ \2، \3، \4 إلخ.

هذه مجرد مقدمة لقوة التعبيرات العادية.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions