مقدمة:
تُعد التعبيرات النمطية أو (Regular Expressions) أحد المهارات الأساسية التي يجب على المبرمجين تعلمها لتحسين كفاءتهم وفعاليتهم في العمل البرمجي بشكل عام والتعامل مع النصوص بشكل خاص؛ فالتعبيرات النمطية (Regular Expressions) هي مجموعة من القواعد التي تستخدم لتحديد النمط المطابق لسلسلة محددة من النصوص، وغالبًا ما تُستخدم في البرمجة ومعالجة النصوص والتحقق من التنسيق الصحيح للبيانات.
أو بعبارة أخرى، تسمح التعبيرات النمطية (Regular Expressions) للمستخدمين وخاصةً المبرمجين بكتابة أنماط للبحث عن شيء محدد داخل النصوص، على سبيل المثال يمكن استخدام التعبيرات النمطية للعثور على العناوين البريدية أو أرقام الهواتف في نص معين أو لإزالة جميع الرموز غير الضرورية من سلسلة نصية.
ما هي التعبيرات النمطية Regex؟
يتم اختصار التعبيرات النمطية في الكلمة Regex, وهي اختصار ل (Regular Expressions.
تحتوي التعبيرات النمطية (Regular Expressions) على العديد من العناصر المختلفة التي تسمى حروف خاصة (special characters)، والتي يمكن من خلالها التعبير عن الحروف والأرقام والمسافات وغيره، ويؤدي الفهم الجيد لهذه العناصر إلى تمكنك من كتابة أنماط تطابق تمامًا ما تريد البحث عنه.
فهي تساعد المبرمجين في تصفية وتحديد أنواع محددة من النصوص والبيانات، وتقليل وقت البحث والتحليل.
كيف نستخدم التعابيرات النمطية Regex؟
يمكن تنفيذ التعبيرات النمطية باستخدام العديد من اللغات البرمجية المختلفة مثل Python وJava script وPHP وغيرهم الكثير، فضلا عن توفرها في كثير من البرامج مثل: notepad++ وVisual Studio “` و Visual Studio IDE وبرامج microsoft office.
وما يميزها أن قواعدها تقريبا واحدة في معظم لغات البرمجة، ولكن في بعض الحلات تقوم البرامج بتخصيصها بشكل مختلف مثل microsoft office.
لذا، في هذه المقالة سنتناول أكثر الحروف الخاصة (special characters)، شيوعا واستخداما، من وجهة النظر البرمجية، وأيضاً بشكل عام وليس للغة برمجة محددة.
ويمكنكم التطبيق دون استخدام لغة برمجة من خلال موقع regexr.com.
استخدام الموقع بسيط جدا، هناك مربعين تحرير (edit):
Flags
هذا لكتابة النمط.
Text
وهذا لكتابة النص المراد البحث فيه.
فوق هذا مربع التحرير سنجد نتيجة التطابق، إما لا يوجد تطابق (no match) أو هناك تطابق (match).
وأسفله سنجد عبارة List يمكننا الضغط عليها لإظهار ما تم التطابق معه بالضبط.
أيضاً يمكنك الضغط على Explain لعرض شرح النمط الذي قمت بإدخاله.
هيا بنا نبدأ في شرح الحروف الخاصة.
الأحرف المميزة (Special Characters):
الأحرف المميزة (Special Characters) هي عبارة عن رموز لها معنى خاص، ويتم استخدامها للتعبير عن أحد الأشياء التالية:
^:
يتم استخدام علامة “^” للتعبير عن الأحرف الموضوعة في بداية كل سطر في النص.
مثال:
^hello
وبالتالي هذا النمط سيتطابق إذا كان النص به سطر يبدأ بكلمة “hello”.
ملحوظة: ليس هذا الاستخدام الوحيد لهذا الرمز؛ حيث سنقوم بتناول استخدام آخر له لاحقاً.
$:
أما هذا، فإنه الوجه الآخر للرمز السابق، حيث يقوم بالتحقق من الأحرف الموضوعة في نهاية كل سطر في النص.
مثال:
world$
يبحث هذا النمط على سطر ينتهي بكلمة “world”.
.:
تشير النقطة إلى وجوب وجود أي حرف (Character) ما عدا حرف السطر الجديد \n.
مثال:
he..o
وبالتالي سيتطابق هذا النمط إذا كان هناك بالنص “he” يتبعهم حرفين(Character) وبعدهما حرف “o”.
ملحوظة: هذا النمط ليس من الضروري أن ينطبق مع كلمة واحدة مثل hello؛ فالنقطة تشير إلى جميع Characters بما فيها المسافات وعلمات الترقيم وغيره.
الأقواس الهلالية ():
تستخدم الأقواس الهلالية “()” لتقسيم النمط إلى مجموعات (groups).
بمعنا أنه يمكن تحديد جزء محدد من النمط ووضعه داخل الأقواس الهلالية، أي يتم تكوين مجموعة من الحروف أو الأحرف التي يتم التعامل معها كوحدة واحدة في النمط.
مثال:
(hello)
وبذلك سيتم التعامل مع كلمة “hello” كوحدة واحدة، ومن ثم يمكننا البحث عن تكرارها داخل النص أو البحث عن ما يلحقها أو يسبقها من حروف كما سنرى لاحقا.
-:
أما هذا الرمز فإنه يعادل استخدام العبارة “or”، أي أنه يستخدم لمعرفة ما إذا كان النص الموضوع قبله أو النص الموضوع بعده موجود في النص.
مثال:
(hi)-(hello)
سوف يتطابق ذلك النمط إذا كان النص به أحد الكلمتين “hi” أو “hello”.
:
العلامة “\” (backslash) تستخدم في تخطي (escaping) الحروف الخاصة في التعبيرات النمطية Regular Expressions، أي إخبار المعالج بأن الحرف الموجود بعدها يجب أن يتم معاملته على أنه حرف عادي وليس حرف خاص.
على سبيل المثال، إذا كنت تريد البحث عن عبارة “I love (regex)” وتحتوي العبارة على الحرف الخاص “(“، فيجب عليك استخدام ال”\” backslash قبل الحرف “(” وتحويله إلى حرف عادي.
يمكن كتابة النمط كالتالي:
I love \(regex\)
علامات التحديد والكميات، (Quantifiers):
Quantifiers هي عبارة عن عناصر في الـ Regular Expression تستخدم لتحديد عدد ظهور الحرف أو النمط الذي يسبقها في النص الذي تبحث عنه.
هناك عدة Quantifiers يمكن استخدامها في Regular Expression، ومن أهمها:
+
يعبر عن وجود تكرار واحد أو أكثر من الحرف أو النمط الذي يسبقها، ويستخدم لتحديد تكرار مرة واحدة على الأقل للحروف أو النمط الذي يجب أن يحتوي عليه النص.
مثال:
m+
يشير ذلك لوجوب تكرار الحرف “m” على الأقل مرة واحدة بشكل متتالي.
*:
يعبر عن الصفر أو أكثر من تكرار الحرف أو النمط الذي يسبقها.
أي يستخدم في حال عدم الإكتراث ما إذا كان الحرف الموضوع قبله موجود مرة أو عدة مرات بشكل متتالي أو غير موجود على الإطلاق في النص.
مثال:
abc*
يشير هذا النمط إلى وجوب وجود الحرفين “a” و “b” بشكل متتالي، ولا يهم إذا كان يوجد بعده حرف “c” أو أكثر أو لا يوجد على الإطلاق.
؟:
يشبه هذا الرمز الرمز السابق، ولكنه يختلف عنه في أنه يعبر عن وجود صفر أو حرف واحد من الحرف أو النمط الذي يسبقها، حيث يستخدم لتحديد الحروف الاختيارية في النص.
على سبيل المثال يمكن استخدامه للبحث عن أرقام الهواتف ووضع رقم مفتاح الدولة اختيارياً كما في المثال التالي:
(\+2)؟0123456789
ملحوظة: تم كتابة العلامة “\” قبل الحرف “+” حتى يتم التعامل معه على إنه حرف عادي وليس حرف خاص.
{}:
تستخدم هذه الأقواس لمعرفة ما إذا كان الحرف الموضوع قبلها موجود بشكل متتالي في النص عدد محدد من المرات.
مثال:
m{3}
يقصد من ذلك هل هناك 3 أحرف “m” بشكل متتالي في النص؟
أيضا يمكننا باستخدامها معرفة ما إذا كان الحرف الموضوع قبلها موجود في النص بشكل متتالي عدد مرات محصور بين عددين.
مثال
m{3،5}
ويُقصد من ذلك هل هناك من 3 إلى 5 أحرف “m” بشكل متتالي في النص؟
كما يمكننا استخدامها لتحديد الحد الأدنى لتكرار ما يسبقها من أحرف أو نمط بشكل متتالي في النص.
مثال:
m{5،}
وبالتالي سيتطابق ذلك النمط إذا كان هناك على الأقل 5 أحرف “m” بشكل متتالي في النص.
وأخيرا يمكننا استخدامها لتحديد الحد الأقصى لتكرار ما يسبقها من أحرف أو نمط بشكل متتالي في النص.
مثال:
m{،5}
وبالتالي سيتطابق ذلك النمط إذا كان هناك على الأكثر 5 أحرف “m” بشكل متتالي في النص.
المجموعات (Sets):
في الـ Regular Expression، يستخدم الأقواس المربعة “[]” لعمل مجموعة (set) لتحديد مجموعة من الأحرف أو الأرقام أو الرموز التي يمكن أن يتم مطابقتها في النص المراد البحث عنه.
على سبيل المثال، يمكن استخدام “[abc]” للتعبير عن أن أيًا من الأحرف “a” أو “b” أو “c” يمكن أن يتم مطابقتها في النص.
يمكن أيضًا استخدام الأقواس المربعة لتحديد نطاق من الأحرف أو الأرقام أو الرموز، وفيما يلي بعض الاستخدامات للsets:
- “[abc]”: للتعبير عن أن أيًا من الأحرف “a” أو “b” أو “c” يمكن أن يتم مطابقتها في النص.
- “[0-9]”: لتحديد أي رقم بين 0 و 9.
- “[a-z]”: لتحديد أي حرف بين “a” و “z” small، أيضا يمكن تحديد النطاق للحروف capital بكتابة المدى “[A-Z]” أو جمعهما معاً “[a-zA-Z]”.
- “[أ-ي]”: كما يمكن استخدام ذلك لتحديد أي حرف بين “أ” و “ي”.
- الاستخدام الآخر لعلامة “^”: حيث إذا وضعت “^” بداية الأقواس المربعة، فهذا يعني عكس المجموعة، أي أنه يجب مطابقة أي حرف غير موجود ضمن المجموعة. على سبيل المثال، “[^abc]” يعني أي حرف غير “a” أو “b” أو “c”.
ملحوظة: يمكن استخدام الأقواس المربعة مع علامات التحديد والكميات، مثل “+” أو “*” أو “?”، لتحديد عدد الظهور المسموح به للأحرف المطابقة في المجموعة، كما يمكن كتابة أكثر من مدى داخل نفس الأقواس.
على سبيل المثال، جمع مدى بين الأرقام والحروف مثل: “{3-9A-h]”.
السلاسل المميزة (Special Sequences):
السلاسل المميزة ( Special Sequences ) عبارة عن مجموعة أحرف يصبح لها معنى خاص حين يتم وضعها بعد الرمز \، ويوضح الجدول التالي بعض السلاسل المميزة الأكثر استخداماً في التعبيرات النمطية:
الرمز | شرحه |
---|---|
\w | تطابق أي حرف أو رقم أو علامة شرطة سفلية “_” |
\W | تطابق أي شيء ما عدا حرف ورقم وعلامة شرطة سفلية “_” |
\d | تطابق أي رقم |
\D | تطابق أي شيء ما عدا الأرقام |
\s | تطابق أي مسافة فارغة (space). |
\S | تطابق أي شيء باستثناء المسافات الفارغة (spaces). |
\t | تستخدم لتمثيل الإزاحة تاب (tab). |
\T | تستخدم لتمثيل كل شيء باستثناء الإزاحة تاب (tab). |
\n | تستخدم لتمثيل سطر جديد (New line). |
\A | تُرجع تطابقًا إذا كانت الأحرف المحددة بعدها في بداية النص. |
\Z | تُرجع تطابقًا إذا كانت الأحرف المحددة قبلها في نهاية النص. |
\b | يتم استخدامها لتحديد حدود الكلمة، حيث يتم تحديد الأحرف المحددة في بداية الكلمة أو في نهايتها، على سبيل المثال “\bth” للبحث عن الكلمة التي تبدأ بحرفي “th”، أو “e\b” للبحث عن الكلمة التي تنتهي بحرف “e”، أيضا يمكن استخدامه لتحديد بداية ونهاية الكلمة معاً. |
\B | يقوم بإرجاع تطابق حيث توجد الأحرف المحددة ، ولكن ليس في بداية أو في نهاية الكلمة، يتم وضع الحروف بعدها إذا كنا نريد ألا تكن بداية الكلمة، ونضعها قبلها إذا كنا لا نريدها نهاية الكلمة. |
أمثلة على التعبيرات النمطية Regex:
سنقوم في هذا الجزء بتطبيق ما تم تناوله في هذه المقالة على أمثلة عملية، حتى لا نكون قمنا بتناولها بشكل تلقيمي أو نظري، ولكن سنقوم بتدعيم ما تناولناه بأمثلة من الواقع العملي.
البحث عن عناوين البريد الإلكتروني:
لنفترض أن لدينا نص يحتوي على الكثير من المعلومات، ونريد فقط استخراج عناوين البريد الإلكتروني منه.
عادةً ما يتكون عنوان البريد الإلكتروني من اسم المستخدم، متبوعًا بعلامة @، ثم النطاق الذي يشير إلى خادم البريد الإلكتروني، وعليه يكون ما يلي تكوين النمط الخاص للبحث عن البريد الإلكتروني:
- “[a-zA-Z0-9.]”: للتعبير عن اسم المستخدم والذي يمكن أن يتكون من حرف أو رقم أو علامة نقطة، وتم استخدام “+” لضرورة وجود حرف على الأقل.
- “@”: وجود علامة “@” بعد اسم المستخدم.
- “[a-zA-Z0-9.-]+”: وهذا لضرورة وجود حرف واحد على الأقل بعد الat وقبل النطاق.
- “.[a-zA-Z]{2،}”: وهذا للتعبير عن النقطة ومن ثم النطاق الذي يجب أن يتكون من حرفين على الأقل.
وهذا هو النمط كاملا:
^[a-zA-Z0-9.]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2،}$
ملحوظة: تم وضع علامة “^” في بداية النمط وعلامة “$” في نهايته للتأكد من أنه يبدأ وينتهي بشكل صحيح، حيث كما قلنا يعبران عن بداية ونهاية السطر.
البحث عن أرقام الهواتف المصرية:
لنفترض أيضا أن لدينا ملف نصي يحتوي على الكثير من المعلومات ونريد استخراج أرقام هواتف المحمول المصرية.
تتكون أرقام هواتف المحمول في مصر من 01 ويليهم أحد الأرقام 0 أو 1 أو 2 أو 5، حسب شركة خطوط الهواتف، ثم ينتهي ب8 أرقام.
كما يمكن أن تحتوي على مفتاح الدولة +20.
وعليه يتكون هذا النمط من الأجزاء التالية:
.1 “(+2)؟”: للبحث عن مفتاح الدولة اختياريا.
2. “01”: للتأكد من أن الرقم يبدأ بـ 01.
3. “[0125]”: للتأكد من أن الرقم الثاني هو أحد الأرقام التالية: 0، 1، 2، 5.
4. “[0-9]{8}”: للتأكد من وجود 8 أرقام بعد الرقم الثاني.
وهذا هو النمط كاملا:
^(\+2)?01[0125][0-9]{8}$
البحث عن الدومينات:
لعمل نمط لرابط، دومين يجب علينا أولاً فهم تركيبة الرابط وأجزائه المختلفة.
يتكون الرابط الإلكتروني من أربعة أجزاء رئيسية:
- يمكن أن يحتوي على بروتوكول النقل (Protocol): مثل “http” أو “https” ويليه “://”.
- يمكن أن يحتوي على “www.”.
- اسم الدومين.
- النطاق.
وبناءً على ذلك، يمكننا صياغة نمط يستخدم للتحقق من صحة الرابط الإلكتروني، وهو عبارة عن:
- “(https?:\/\/)?”: يحدد مفتاح البروتوكول اختياريًا، أي إما “http://” أو “https://”.
- “(www.)?”: يحدد “www.” اختياريًا، أي يمكن أن يكون موجودًا أو غير موجود.
- “.+”: يعني أي حرف أو رمز آخر يظهر ولكن على الأقل يجب أن يظهر حرف واحد أو رمز واحد على الأقل في اسم الدومين.
- “.”: يحدد النقطة قبل النطاق.
- “[a-zA-Z]{2,}”: يحدد حرفين على الأقل لاسم النطاق، مما يعني نطاقًا صالحًا مثل “.com” أو “.net”.
النمط كاملا:
^(https?:\/\/)?(www\.)?.+\.[a-zA-Z]{2,}$
الختام:
لقد استهدفنا من خلال هذه المقالة شرح التعبيرات النمطية (Regular Expressions)، ومحاولة معرفة أكثر عناصرها استخداما وشيوعا والتي تعرف باسم الحروف الخاصة.
وكما رأينا، تساعدنا كثيرا في فلترة وتحديد أنواع محددة من النصوص والبيانات، وتقليل وقت البحث والتحليل.
وعليه، فإن فهم هذه الأداة يعد مهما جدا للمبرمجين ومحللي البيانات ومستخدمي الحوسبة بشكل عام، حيث تتيح لهم تحديد نمط معين من البيانات، وإنشاء الأنماط الصحيحة للأشكال المطلوبة.
فلا يمكن إنكار أهمية الحروف الخاصة في عالم البرمجة، فهي تعد أحد أساسيات الأدوات المتاحة للمبرمجين لتسهيل عملية البحث والتحليل، وتساعد في تطوير تطبيقات أفضل وأكثر دقة وكفاءة.
لذا، يجب على المبرمجين والمهتمين بالبرمجة بشكل عام، تعلم استخدام هذه الحروف الخاصة بطريقة صحيحة وفعالة لتحسين أدائهم.
المصادر:
2- regex101
3- JavaScript RegExp Object – W3Schools