مقدمة
بصفتنا مسؤولين نظام ومطورين ومهندسي ضمان الجودة ومهندسي الدعم وما إلى ذلك، نحتاج إلى العثور على نمط معين، مثل مجموعة من عناوين 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