اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

Regex هي اختصار لـ Regular expression وتسمى باللغة العربية تعابير عادية أو تعابير نمطية، وهي تسلسل من الحروف التي تُعرف نمط للبحث، وهذه التعابير تستخدم بشكل أساسي في عمليات البحث و المطابقة بين السلاسل النصية مثل العمليات من نوع "أبحث ثم استبدل".

ولدى هذه التعابير رموز خاصة بها مثل ^ الذي يرمز لبداية الصفحة و $ الذي يرمز لنهايتها.

المصدر

  • 1
نشر

regex أو regexp هي طريقة لمطابقة السلاسل النصية بشكل كامل أو جزئي بالاعتماد على خليط من المحارف والأرقام و رموز الاستبدال والتكرار التي تمثل مجتمعة هيكلية لعمل نمط تطابق مع نصوص لاستخراج الكلمات المتشابهة التي تنتمي لنفس نمط البحث.

  • يطلق عليها باللغة العربية  التعابير النمطية أو التعابير المنتظمة أو أحرف البدل.

في حال التعامل معها للبحث في نص باللغة الإنكليزية نستخدم محارف جدول ASCII أي الحروف الإنكليزية

abcd ...  a-z
ABCD ...  A-Z
123       0-9

!@#$%^&*() ..

 أما في حال البحث في لغات أخرى، تختلف قيم المحارف حسب اللغات الطبيعية فمثلاً للبحث في نص باللغة العربية نستخدم مجال محارف Unicode وغيره حسب اللغة.

محارف التحكم الأساسية:

  • محرف (أو) بشكل محرف العمود ( "|" ) المنطقي Boolean  ويُستخدم لإيجاد ناتج بحث من أحد خيارين ويكثر استخدامه في الكلمات التي يمكن أن تُكتب بشكلين أو أكثر مثل الكلمة الإنكليزية للون الرمادي 
    gray | grey
    فوجود هذا التعبير، يعمل على البحث عن أحد الشكلين للكلمة.
  • التجميع Grouping باستخدام ( ) الأقواس المدورة / الدائرية حيث نقوم بالتعبير عن مجموعة بحث جزئية مثلاً وضع 
    gr(a|e)y
    هنا سيتم عمل مطابقة لأول حرفين g - r ثم مجموعة اختيارية من a - e ثم y

محددات الكميات / التكرارات:

  • إشارة الاستفهام ? وهي محرف تحكم، نكتبها بعد النمط الجزئي أو الحرف مثلاً وهي تقبل ظهور محرف أو عدم ظهوره ضمن سلسلة نصية (أي يكون لدينا محرف اختياري) أي يمكن للمحرف أن يتواجد 0 أو 1 مرة ليتم قبول النمط مثل كلمة اللون باللغة الإنكليزية 
    colou?r
    حيث يمكن كتابتها بشكلين مع أو بدون حرف u وكلاً من ناتجي البحث مقبول
  • النجمة * تقبل وجود النمط / المحرف بعدد تكرارات من 0 أي يمكن ألا يظهر، إلى اللانهاية (أي بدون تحديد عدد أعظمي لتكرار النمط الجزئي) مثلا النمط 
    ab*c
    ووجود النجمة بعد حرف b أي يمكن أن يتكرر b من 0 إلى عدد غير محدد من المرات حيث يقبل السلاسل التالية مثلًا  
    ac, abc, abbc, abbbc

    عدد مرات ظهور b غير محدد.

  • إشارة الجمع أو زائد + تقبل وجود النمط / المحرف بعدد تكرارات من 1 أي يمكن أن يظهر المحرف مرة واحدة على الأقل، إلى اللانهاية (أي بدون تحديد عدد أعظمي لتكرار النمط الجزئي) مثلا النمط ab+c ووجود زائد بعد حرف b أي يمكن أن تم تكرار b من 1 إلى عدد غير محدد من المرات حيث يقبل السلاسل التالية مثلًا  
    abc, abbc, abbbc
    عدد مرات ظهور b مرة على الأقل، أي على عكس النجمة الحد الأدنى هو تكرار واحد على الأقل.
  • مجال تكرار محدد، يمكن استعمال الأقواس المجعدة curly brackets { } مع وضع رقمين بينهما فاصلة يمثلان الحد الأدنى والأعلى للتكرار المسموع به للمجموعة الجزئية أو المحرف
    {n}  	    تكرار بالضبط n مطابقة
    {min,} 	    تحديد الحد الأدنى
    {,max} 	    تحديد الحد الأعلى
    {min,max} 	تحديد مجال بين حد أدنى و حد أعلى

    مثلاً للبحث عن hello يمكن كتابة 

    hel{2}o => hello
                 ^^

    سيتم البحث عن تطابق للنمط مع حرفين L

  • النقطة "." وتعبر عن محرف وحيد غير محدد أي محرف ممكن أن يظهر مثلا 

    a.c

    يمكن أن يظهر بين a و b أي محرف آخر مثل

    aac
    abc
    acc
    aec
    adc
    aoc
     ^  متغير

     

  • قبول محرف من عدة محارف باستخدام الأقواس المربعة [ ] مثلا في حال كتابة 

    [abc] =>

    سيتم قبول أحد الرموز التالية

    a أو
    b أو
    c

     

  • تحديد مجال من المحارف المتتالية أبجدياً أو رقميا 

    المطابقة لأحد الأحرف  <= المجال
    
    a-c    =>  a b c
    
    b-e    =>  b c d e
    
    A-D    =>  A B C D
      
    A-Z    =>  جميع الأحرف بشكل كبير capital
      
    a-z    =>  جميع الأحرف بشكل صغير small 
      
    0-9    =>   أي رقم
    

    .

  • عدم انتماء لمجال، لا نريد للحرف الحالي أن يكون abc نكتب

    [^abc]

     

  • يختلف تطبيقه من لغة برمجة لأخرى بشكل بيسط وحسب المكتبة التي تريد استعمالها لكل منها

  • يمثل المحرف ^ بداية النمط ويمثل $ نهايته

  • مثال لاختبار هل النص التالي يمثل بريد الكتروني 

    "^ [a-zA-Z0-9_.+-]+ @ [a-zA-Z0-9-]+ \. [a-zA-Z0-9-.]+ $"
     ^ ^^^^^^^^^^^^^^^^ ^ ^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^ ^
     1     2            3      4         5        6       7

    حيث نلاحظ

  1. محرف بداية ^

  2. مجال من أحرف ومحارف مكرر على الأقل مرة واحدة (كل حرف إما يتبع لمجال أو يكون _ + - .)

  3. محرف @

  4. مجال مثل 2

  5. النقطة نفسها مع محرف هروب

  6. مجال محارف آخر

  7. محرف النهاية $

  • 2
نشر

ماهو الـ Regex؟

كلمة RegEx هي إختصار للعبارة Regular Expression وتعني التعابير النمطية، وهي طريقة للبحث عن نصوص معينة ومطابقتها في مستند بإستخدام نمط Pattern، فعلى سبيل المثال إن أردت حذف كل المسافات في مستند ما، فعليك أن تقوم بذلك يدويًا أو تقوم ببرمجة سكريبت كبير للبحث عن المسافات بكل أنواعها، لكن هذا الأمر سوف يستغرق منك الكثير من الجهد والوقت وقد لا تنجح في النهاية في هذه المهمة، بينما يمكنك أن تستعمل التعابير النمطية Regex لتسهيل هذه المهمة، وكل ما عليك هو كتابة مجموعة من الرموز كالتالي على سبيل المثال:

/^\s+|\s+$|\s+(?=\s)/g

قد تبدو الرموز السابقة عشوائية وغير واضحة على الإطلاق، ولكن لكل رمز من الرموز السابقة معنى يعبر عنه، وسأشرح هذه الرموز بطريقة بسيطة. يسمى الرمز السابق بالنمط Pattern، أي أنك تقوم بالبحث عن نمط معين في نص ما وسوف تحثل في النهاية على كل الكلمات المطابقة للنمط الذي حددته.

ملاحظة: يُمكن إستخدام موقع regex101 لتجربة كل الأمثلة التالية وتجربتها.

النمط Pattern

يتكون النمط من علامتي القسمة Slash

/  /

ويكتب بينهما كل الرموز المستخدمه في عملية البحث، وقد يأتي بعدهما حرف مثل حرف g في المثال السابق، ويسمى هذا الحرف بـ "علم التعبير Expression Flag" وسوف نتطرق إليه لاحقًا.

إذا قُمتَ بإضافة أي كلمة بين هذه العلامات سوف يتم تحديدها، فعلى سبيل المثال إن أردت البحث عن كلمة "hello" في نص ما، يمكنك أن تقوم بالبحث عنها بهذه الطريقة:

/hello/g

وستكون النتيجة كالتالي:

618550c7a731b_Screenshot2021-11-05174148.png.80f554a1f3e4838aac0ef92da1c3f429.png

لاحظ كيف تم تحديد كل كلمات hello، ولكن لماذا لم يتم تحديد كلمة Hello الأخيرة؟ لذلك لأن كلمة hello تختلف عن Hello فالتعابير النمطية regex حساسة لحالة الأحرف، ولكن لحسن الحظ تسمح التعابير النمطية Regex بتحديد كل أشكال الكلمة وبأكثر من طريقة، كالتالي:
يُمكن أن نستخدم علامة pipe  ( | ) وهي تستخدم للتعبير عن حرف من حرفين، فعلى سبيل المثال إن إستخدمنا التعبير النمطي التالي:

/[h|H]ello/g

سوف يتم تحديد كلمة hello و Hello معًا، ذلك لأن علامة | تستخدم وكأننا نقوم حرف h أو H ثم باقي الكلمة ello، وستكون النتيجة كالتالي:
6185525c5b54b_Screenshot2021-11-05174837.png.c49479c7b30b97affb7eaa0012c4a549.png

الآن تم تحديد كل كلمات hello.

لاحظ أيضًا إستخدام القوسين [  ] في المثال السابق وذلك لتحديد حرف واحد فقط من كلا الحرفين (H و h)، بينما إذا لم نستخدم الأقواس سوف يتم تحديد الحرف h وكلمة Hello فقط ، وكأننا نقوم أبحث عن الحرف h أو كلمة Hello :

618552f75a251_Screenshot2021-11-05175111.png.3e07ab3836d15ec382de03fd644357eb.png

يمكن أيضًا إستخدام نقطة . للتعبير عن "أي حرف"، فعلى سبيل المثال يمكن تحديد كلمة hello و Hello من خلال التعبير التالي:

/.ello/g

التعبير النمطي السابق سوف يقوم بتحديد أي نص يحتوي على كلمة ello ويبدأ بأي حرف حتى وإن لم يكن حرف h ، فمثلًا سوف يتم تحديد كلمات مثل gello و sello أو أي كلمة تبدأ بأي حرف وبعده ello 

تحديد الكلمات الإنجليزية

يُمكن إستخدام رموز خاصة في التعابير النمطية لأداء مهمة معينة، فعلى سبيل المثال يُمكن تحديد كل الحروف أو الأرقام على حدى من خلال \w، كالتالي:

61855b5b60365_Screenshot2021-11-05182700.png.34d8c0ba9694de5f2379cce15f340859.png

كما يمكن تحديد كل الكلمات من خلال إضافة علامة + إلى التعبير النمطي السابق:
61855c5bcd1ab_Screenshot2021-11-05183112.png.29f71a9a01f42d657fe9ac645a7c61c8.png

علامة + تعني تكرار الرمز السابق لها (وهو \w في هذه الحالة) بأي عدد من المرات، وبالتالي سيتم تحديد أي مجموعة من الحروف معًا أو بمعنى آخر الكلمات فقط (حتى وإن إن كانت تحتوي الكلمات على أرقام).

يُمكننا تحديد كذلك الكلمات التي لا تحتوي على أرقام بل حروف فقط من خلال إستخدام الرمز [a-z] وسوف يقوم بتحديد كل الحروف الإنجليزية

61855ce50a244_Screenshot2021-11-05183234.png.a0ad3af3191a6bb802a824ef67a305cd.png

لاحظ في المثال الأول تم تحديد كل الحروف الإنجليزية الصغيرة Small Letters بينما في المثال الثاني تم تحديد كل الحروف الإنجليزية الكبيرة والصغيرة.

إستخدام التعابير النمطية RegEx مع النصوص العربية

نستطيع أيضًا إستخدام التعابير النمطية مع الكلمات العربية:

618555c09121d_Screenshot2021-11-05180308.png.d6fb677f2ddf68a5f8b569ec63a4f402.png

قد تتسأل لماذا لم يتم تحديد كل كلمات "مرحبًا"، وذلك لأن في اللغة العربية (وغيرها من اللغات) تحتوي على تشكيل للحروف، ويعتبر كل تشكيل حرف منفصل، فحركة الضمة حرف، والكسرة حرف والشدة حرف .. إلخ، فكلمة "مرحبا" تختلف عن "مَرْحَبًا"، وبالتالي لن نتمكن من تحديد الكلمات التي لها تشكيل مختلف بسهولة، لذلك يتم إستعمال رموز unicode لحل هذه المشكلة في كثير من الأحيان كما سنرى لاحقًا.

تحديد الكلمات العربية

قمنا سابقًا بتحديد الكلمات الإنجليزية بالكامل من خلال الرمز [a-z] ونستطيع تطبيق نفس الفكرة من على الكلمات العربية من خلال الرمز [ء-ي] حيث تبدأ الحروف العربية بالهمزة وتنتهي بالياء

61855dc3d44e0_Screenshot2021-11-05183718.png.f69e0c3aef6420ab61a7423f018658e4.png

يُمكن إستخدام رموز unicode كما أشرت سابقًا بدلًا من الحروف العربية. تُكتب رموز Unicode بالشكل التالي u0627\

\u0627 حرف الألف ا
\u0628 حرف الباء ب

مع العلم أن كل الحروف والرموز العربية بما فيها رموز التشكيل والحركات تنحصر بين u0600\ و u06FF\ بشكل عام، وكل الأحرف تنحصر بين u0621\ و u0650\ ، كما تنحصر رموز التشكيل ما بين u064B\ و u0652\

ملاحظة: بعض البرامج ولغات البرمجة لا تدعم الشكل السابق ولكن يتم تتغيره إلى الصيغة x{0627}\ كالتالي:
618562487df96_Screenshot2021-11-05185254.png.c8932ada4e7280b1a2e936012778d812.png

تحديد كلمة عربية بغض النظر عن تشكيلها

نستطيع الآن تحديد أي كلمة عربية من خلال إستخدام رموز Unicode بغض النظر عن تشكيلها أو حركات الحروف بها. في المثال التالي يتم تحديد كل كلمات "من" بكل أشكالها:

618564b5b0b67_Screenshot2021-11-05190656.png.e7a563d34b068c5ad0fdc758d50a480c.png

لاحظ كيف تم التعويض عن تشكيل كل حرف بإستخدام رموز Unicode

إستخدام التعابير النمطية RegEx في لغات البرمجة

توفر كل لغات البرمجة طريقة للتعامل مع التعابير النمطية RegEx، فعلى سبيل المثال توفر لغة Python مكتبة re للتعامل مع التعابير النمطية، كما توفر لغة JavaScript الكائن RegExp كما توفر التعامل مع النصوص بإستخدام التعابير النمطية بصورة مباشرة.

var str = 'fee fi fo fum';
var myArray = str.match(/\w+\s/g);
console.log(myArray);

// ["fee ", "fi ", "fo "]

 

إستخدام التعابير النمطية في محررات النصوص

توفر برامج تحرير النصوص والأكواد مثل VS Code و Sublime Text و Notepad++ طرقًا للتعامل مع التعابير النمطية والبحث في المستندات وتبديل القيم بنصوص أخرى، وذلك من خلال البحث Ctrl + f أو البحث والإستبدال Ctrl + h 

61856c4bc75fb_Screenshot2021-11-05193548.png.c212477fdf691ca285857be7ea565b7f.png

61856c519c88c_Screenshot2021-11-05193635.png.0315f7be3e6c20ca5df7478f2a892161.png

مصادر إضافية

كما توفر موسوعة حسوب شرح كامل لمكتبة re في بايثون يمكنك الإطلاع عليه من هنا، وكذلك شرح للكائن RegExp في لغة JavaScript.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...