السلام عليكم و رحمة الله و بركاته
التعابير القياسية (regular expression أو إختصارا regex) هي مادة ليست حكر على البيرل وحده, فالعديد من اللغات و الأدوات (كالsed,awk) تستعمله.
في البيرل الطريقة البدائية لتطبيق الregex هي عبر =~ أو !~. فالأولى هي للتطابق, كأننا نفحص وجود شيء أما الثانية فالعكس.
يوجد لدينا 3 operator رئيسية في التعابيرل القياسية في البيرل:
- Match Regular Expression - m//
- Substitute Regular Expression - s///
- Transliterate Regular Expression - tr///
طبعا ال / في هذه الoperator بالإمكان تغييره لأي delimiter آخر, ال# كمثال.
نبدأ مع ال Match Operator
هذا الoperator إسم على مسمى, فهو يستعمل لعملية الMatching لكلمة أو حرف أو جملة. مثلا نحن لدينا جملة:
“sec4ever to learn”
نحن نريد أن نفحص وجود الكلمة "sec" بالكود التالي:
كود:
$test = "sec4ever to learn";
عند تشغيله: سيطبع “Match”. فكما رأينا عند وجود الكلمة الناتج يأتي true و لذلك طبع Match.
كما ذكرنا سابقا فيمكننا تغيير الdelimiter فالمثال السابق بالإمكان كتابته ك:
1-
كود:
$test = "sec4ever to learn";
كود:
$test = "sec4ever to learn";
كود:
$test = "sec4ever to learn";
جميع النتائج هي نفسها: “Match”. كما رأينا علينا إسمال الوثم m مع أي delimiter إلا ال// فهو معرف بm وحده أي إن // هي نفس m//.
طبعا لدينا modifiers غير الm:

بالنسبة للregex فلدينا العديد من الsyntax لكن قبل شرحهم, لدينا بعض الspecial variable خاص بالregex ف
$& هي للتطابق نفسه.
$` كل ما قبل التطابق.
$' كل ما بعد التطابق.
مثال:

الآن نرجع لصيغ التعابير القياسية:
ال Substitution Operator:
هذا الoperator معرف ب:s/// طبعا ال/ بالإمكان تغييره لأي delimiter
و ظيفته من إسمه هي الإستبدال
مثلا لدينا الجملة:
“I’m learning perl”
و أريد تغيير perl لphp بأستعمل الكود التالي:

ال Modifiers الخاصة بهذا المود هي نفسها للمود السابق.
ال Translation Operator
هي نفس ال Substitution operatorتقريبا, لكن الtranslation لا تستعمل التعابير القياسية.
الsyntax هي: tr/// و أيضا يمكننا تغيير الdelimiter.
مثال:
لدي الجملة:
“perl on sec4ever”
و أريد تغيير كل الأحرفe لo فالكود:

بدون الحرف الواحد يمكننا إستخدام range مثلا لتحويل جميع الأحرف من أحرف صغيرة لكبيرة يمكننا إستعمال:
tr/[a-z]/[A-Z]/ و هي نفس الuc function.
أو الlc function هي: tr/[A-Z]/[a-z]/
الآن نرجع للmatching operator
في عملية الmatching فالنتيجة تحفظ بشكل default بالمتغييرات $1 $2 ….
لكن يمكننا حفظها في متغييرات مثال:

الشرح هو مدخل للregex فالregex أكبر بكثير و معقد أكثر من الصيغ السابقة. لكن أتمنى أن يكون الشرح مفهوم لمن أراد التعمق أكثر فيوجد العديد من المراجع المفيدة.
التطبيق هو:
لدينا ملف /usr/local/cpanel/logs/error_log في السيبنل و هو يحتوي على باسووردات دخول خاطئة أو صحيحة في بعض الأحيان. صيغة السطر المطوب:
'user', 'blabla', 'pass', 'blablapass',
المطلوب هو إستخراج blablapass و وضعهم في الملف pass.txt.
تطبيقي على الملف المرفق:

بتطبيقي فتح الملف و قارنته سطر سطر على الregex و في حال التطابق يطبع الباس في ملفpass.txt.
هذا الأول أما الثاني فهو نفس الأول لكن يجب طبعات الpass مع uppercase و lowercase و الباس.
تطبيقي:

بالمناسبة يمكن إسعمال (.*?) لتطابق أي شيء إلا ال/s.
بالتوفيق و في أمان الله