Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

جافاسكربتالتعابير النمطية

  • مفهوم التعابير النمطية
  • التعامل مع التعابير النمطية
  • إستخدام التعابير النمطية
  • دوال الكائن RegExp
  • الأحرف المميزة
  • وضع مجموعة من الإحتمالات
  • السلاسل المميزة

مفهوم التعابير النمطية

التعابير النمطية ( Regular Expressions ) عبارة عن نصوص تحتوي على أحرف و رموز لها معاني محددة.
للدقة أكثر، كل حرف أو رمز نضعه في هذا النص يعني شيء معين.

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

عندما تقوم بإنشاء حساب في أي موقع إلكتروني يُطلب منك إدخال بريدك الإلكتروني و كلمة سر. عندها أثناء كتابة البريد الإلكتروني و كلمة المرور تجده يظهر لك تنبيهات في حال لم تقم بإدخال بريد إلكتروني صحيح أو كلمة سر لها شكل معين. فمثلاً تجد أنه يطلب منك وضع كلمة سر تتألف من ثمانية أحرف على الأقل و يجب أن تحتوي على حرف كبير, حرف صغير, رقم و رمز.

التعامل مع التعابير النمطية

التعبير النمطي يمكن تجهيزه باستخدام الرمز / / أو من خلال كائن نوعه RegExp.

// الطريقة الأولى
var pattern = /pattern/modifiers;

// الطريقة الثانية
var pattern = new RegExp(pattern, modifiers);
  • pattern - باراميتر إجباري نضع مكانه نص يمثل التعبير النمطي، أي النمط المراد البحث عنه.
  • modifiers - باراميتر إختياري مكانه يمكن وضع الحرف g أو i أو m لتحديد كيف سيتم تطبيق التعبير النمطي.

فيما يلي معنى الأحرف الإختيارية التي يمكن استخدامها مع التعابير النمطية.

الحرف معناه
g يجعل عملية البحث في النص تشمله كله ( Global Match ) بدلاً من التوقف عند أول عملية تطابق يتم إيجادها.
i يجعل عملية البحث في النص لا تراعي حالة الأحرف ( Case Insensitive ) بمعنى أنها لا تكترث ما إن كانت الأحرف الأجنبية كبيرة أو صغيرة.
m يجعل عملية البحث في النص تعامل الرمز ^ و الرمز $ على أنها تمثل بداية كل سطر بدلاً من اعتبارها أحرف تمثل بداية كلمات عادية.

مكان الباراميتر الإختياري modifiers يمكنك استخدام أكثر من حرف، فمثلاً يمكنك استخدام الحرفين ig معاً.


التعبير النمطي المستخدم في المثال التالي معناه إبحث عن الكلمة harmash و لا يهم إن كانت تحتوي على أحرف كبيرة أو صغيرة.
إذاً حتى لو تم إيجاد كلمة البحث مكتوبة Harmash أو HARMASH فإنه سيتم اعتبار أنه تم إيجاد تطابق.

مثال

الأسلوب الأول لتعريف التعبير النمطي.

var pattern = /harmash/i;

الأسلوب الثاني لتعريف التعبير النمطي.

var pattern = new RegExp(/harmash/, 'i');

الأسلوب الثالث لتعريف التعبير النمطي.

var pattern = new RegExp('harmash', 'i');

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

في درس النصوص تعرفنا على جميع الدوال الجاهزة التي يمكن استخدامها للتعامل مع النصوص بما فيها الدالة search() التي يمكن من خلالها البحث في النص و الدالة replace() التي يمكن من خلالها تبديل أجزاء فيه بالإعتماد على التعابير النمطية.

أي تعديل على النص يتم بواسطة هذه الدوال لا يتم تطبيقه على النص الأصلي، بل يتم إرجاع نسخة جديدة معدلة منه.


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

في المثال التالي قمنا باستخدام الدالة replace() للبحث في النص عن كل كلمة 'youtube' موجودة فيه و لا يهم إن كانت تحتوي على أحرف كبيرة أو صغيرة و من ثم قمنا بتبديلها بالكلمة 'Harmash'.

ملاحظة: التعبير النمطي وضعناه كنص عادي، و قد استخدمنا الحرف i لتجاهل ما إن كانت الأحرف كبيرة أو صغيرة، و الحرف g للبحث في كامل النص بدلاً من التوقف عند أول تطابق يتم إيجاده.

مثال

// وضعنا فيه نص عادي text المتغير
let text = "Youtube is free. You can learn anything at youtube.com";

// 'Harmash' بالكلمة 'youtube' مع تبديل كل كلمة text وضعنا فيه نسخة من نص المتغير result المتغير
let result = text.replace(/youtube/gi, 'Harmash');

// result هنا قمنا بعرض النص الموجود في المتغير
document.write(result);

النتيجة:

Harmash is free. You can learn anything at Harmash.com
جرب الكود

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

في المثال التالي قمنا باستخدام الدالة search() للبحث عن رقم أول خانة في النص يوجد عندها الكلمة harmash و لا يهم إن كانت تحتوي على أحرف كبيرة أو صغيرة.

مثال

// وضعنا فيه نص عادي text المتغير
let text = 'Welcome to Harmash.com';

// text موجودة في نص المتغير 'harmash' أول كلمة index وضعنا فيه رقم result المتغير
let result = text.search(/harmash/i);

// لا يساوي 1- فهذا يعني أنه تم إيجاد الكلمة في النص result إذا كان رقم المتغير
if (result != -1) {
    // الخانة التي تم إيجاد التطابق ابتداءاً من عندها index هنا سيتم طباعة رقم
    document.write('found at index = ' + result);
}
else {
    // هنا سيتم طباعة عبارة أنه لم يتم إيجاد تطابق
    document.write('No match found!');
}

النتيجة:

Found at index = 11
جرب الكود

دوال الكائن RegExp

سواء قمت بتعريف التعبير النمطي بواسطة الكونستركتور new RegExp() أو باستخدام الرمز / / فإنه يمكنك الإستفادة من بعض الدوال التي يوفرها لك.

الدالة و تعريفها
1 exec(str) تقارن التعبير النمطي الذي قام باستدعائها مع النص الذي نمرره لها مكان الباراميتر str.
إذا تطابق التعبير النمطي مع النص فإنها ترجع النتيجة كمصفوفة (فيها الموقع الذي تم فيه إيجاد التطابق و القيمة التي تطابقت مع التعبير)، و إن لم يتطابق معه فإنها ترجع القيمة null.
مثال عنها
2 test(str) تقارن التعبير النمطي الذي قام باستدعائها مع النص الذي نمرره لها مكان الباراميتر str.
إذا تطابق التعبير النمطي مع النص فإنها ترجع القيمة true، و إن لم يتطابق معه فإنها ترجع القيمة false.
مثال عنها
3 toString() ترجع نص يمثل التعبير النمطي الذي قام باستدعائها و هو مكتوب باستخدام الرمز / /.
مثال عنها

الأحرف المميزة

الأحرف المميزة ( Special Characters ) عبارة عن رموز لها معنى خاص و لقد ذكرناهم في الجدول التالي.

الرمز إستخدامه
^ يستخدم للتشييك على الأحرف الموضوعة في بداية كل سطر في النص.

مثال: "^Hello"
هذا التعبير يقصد منه هل النص أو كل سطر فيه يبدأ بكلمة Hello.
شاهد مثال
$ يستخدم للتشييك على الأحرف الموضوعة في نهاية كل سطر في النص.

مثال: "world$"
هذا التعبير يقصد منه هل النص أو كل سطر فيه ينتهي بكلمة World.
شاهد مثال
. يستخدم للإشارة إلى وجوب وجود أي حرف ما عدا الحرف \n الذي يشير إلى نهاية السطر.

مثال: "He..o"
هذا التعبير يقصد منه هل يوجد He و بعده حرفين، و بعده يوجد حرف o.
شاهد مثال
+ يستخدم لمعرفة ما إذا كان الحرف الموضوع قبله موجود مرة واحدة على الأقل في النص.

مثال: "Hello+"
هذا التعبير يقصد منه هل يوجد Hell و بعده يوجد حرف o أو أكثر.
شاهد مثال
* يستخدم في حال عدم الإكتراث ما إذا كان الحرف الموضوع قبله موجود مرة، عدة مرات أو غير موجود على الإطلاق في النص.

مثال: "Hel*o"
هذا التعبير يقصد منه هل يوجد Hel و لا يهم إذا كان يوجد بعده حرف l أو أكثر و و يليهم مباشرةً حرف o.
شاهد مثال
? يستخدم لمعرفة ما إذا كان الحرف الموضوع قبله موجود مرة واحدة أو غير موجود في النص.

مثال: "days?"
هذا التعبير يقصد منه هل يوجد الكلمة day أو days.
شاهد مثال
| يستخدم لمعرفة ما إذا كان النص الموضوع قبله أو النص الموضوع بعده موجود في النص.

مثال: "Hello|Hi"
هذا التعبير يقصد منه هل يوجد Hello أو Hi.
شاهد مثال
{n} يستخدم لمعرفة ما إذا كان الحرف الموضوع قبله موجود في النص عدد محدد من المرات.
مكان الحرف n نمرر عدد المرات.

مثال: "we{2}"
هذا التعبير يقصد منه هل يوجد w يليه حرفين e.
شاهد مثال
{n,m} يستخدم لمعرفة ما إذا كان الحرف الموضوع قبله موجود في النص عدد مرات محصور بين عددين.
مكان الحرف n نمرر عدد المرات الأقل، و مكان الحرف m نمرر عدد المرات الأكثر.

مثال: "we{1, 2}"
هذا التعبير يقصد منه هل يوجد w يليه حرف أو حرفين e.
شاهد مثال
{n,} يستخدم لمعرفة ما إذا كان الحرف الموضوع قبله موجود في النص عدد محدد من المرات على الأقل.
مكان الحرف n نمرر عدد المرات.

مثال: "we{2,}"
هذا التعبير يقصد منه هل يوجد w يليه حرفين e على الاقل.
شاهد مثال

وضع مجموعة من الإحتمالات

القصد هنا هو أن تستخدم الرمز [] و بداخله تمرر مجموعة من الأحرف و الرموز الأخرى كما فعلنا في الجدول التالي.

الرمز إستخدامه
[abc] هذا التعبير يقصد منه هل يوجد في النص الحرف a أو b أو c.
شاهد مثال
[^abc] هذا التعبير يقصد منه هل يوجد في النص أي حرف غير الأحرف a و b و c.
شاهد مثال
[a-f] هذا التعبير يقصد منه هل يوجد في النص أحد الأحرف الأبجدية الموجودة بين الحرف a و الحرف f.
هنا كأننا قلنا: [abcdef].
شاهد مثال
[0123] هذا التعبير يقصد منه هل يوجد في النص الرقم 0 أو 1 أو 2 أو 3.
شاهد مثال
[0-9] هذا التعبير يقصد منه هل يوجد في النص أحد الأرقام الموجودة بين الرقم 0 و الرقم 9.
هنا كأننا قلنا: [0123456789].
شاهد مثال
[0-5][0-9] هذا التعبير يقصد منه هل يوجد في النص أي رقمين بين 00 و 59.
شاهد مثال
[a-zA-Z] هذا التعبير يقصد منه هل يوجد في النص أحد الأحرف الأبجدية الموجودة بين a و z، أو الموجودة بين A و Z.
أي كأنك تحاول معرفة ما إن كان يوجد أي حرف من الأحرف الأبجدية سواء كان الحرف كبير ( Capital Letter ) أو صغير ( Small Letter ).
شاهد مثال
[+] هذا التعبير يقصد منه هل يوجد في النص الرمز +.
أي هذا الرمز يعامل هنا كأنه حرف عادي و هذا الأمر ينطبق على باقي الرموز الأخرى مثل *، .، |، $، )، (، {، }.
شاهد مثال
[a\-z] هذا التعبير يقصد منه هل يوجد الحرف a أو الرمز - أو الحرف z في النص.
إذاً، هنا الرمز \ يجعل الحرف الذي يوضع بعده يعامل كأنه حرف عادي و ليس كرمز له معنى خاص.
شاهد مثال
[a-]
[-a]
كلا التعبيرين يقصد منهما هل يوجد الحرف a أو الرمز - في النص.
إذاً، في حال عدم وضع الرمز - بين حرفين أو رقمين فإنه يعامل كأنه حرف عادي و ليس رمز له معنى خاص.
شاهد مثال
[^^] هذا التعبير يقصد منه هل يوجد في النص أي حرف أو رمز ما عدا الرمز ^.
شاهد مثال

السلاسل المميزة

السلاسل المميزة ( Special Sequences ) عبارة عن مجموعة أحرف يصبح لها معنى خاص حين يتم وضعها بعد الرمز \ و لقد ذكرناهم في الجدول التالي.

الرمز إستخدامه
\w يطابق أي حرف بين a-z أو A-Z أو أي رقم بين 0-9 أو الرمز _.
هذا الرمز يعتبر إختصار للتعبير النمطي [a-zA-Z0-9_].
شاهد مثال
\W يطابق أي حرف ليس بين a-z أو A-Z أو رقم أو الرمز _ مثل المسافة الفارغة، الفاصلة، النقطة إلخ..
هذا الرمز يعتبر إختصار للتعبير النمطي [^a-zA-Z0-9_].
شاهد مثال
\d يطابق أي حرف يمثل رقم بين 0 و 9.
هذا الرمز يعتبر إختصار للتعبير النمطي [0-9].
شاهد مثال
\D يطابق أي حرف لا يمثل رقم بين 0 و 9.
هذا الرمز يعتبر إختصار للتعبير النمطي [^0-9].
شاهد مثال
\s يطابق أي حرف يمثل مسافة فارغة أو سطر فارغ.
هذا الرمز يعتبر إختصار للتعبير النمطي [ \t\n\r\f\v].
شاهد مثال
\S يطابق أي حرف لا يمثل مسافة فارغة أو سطر فارغ.
هذا الرمز يعتبر إختصار للتعبير النمطي [^ \t\n\r\f\v].
شاهد مثال
\b يطابق أول أو آخر أي سلسلة أحرف تحتوي على أحرف بين a-z أو A-Z أو أي رقم بين 0-9 أو الرمز _.
  • في حال تم وضع التعبير في آخر سلسلة الأحرف فإنه يبحث عن تطابق موجود في آخر كل سلسلة أحرف غير مقطوعة بمسافة فارغة في النص.
  • في حال تم وضع التعبير في أول سلسلة الأحرف فإنه يبحث عن تطابق موجود في أول كل سلسلة أحرف غير مقطوعة بمسافة فارغة في النص.
شاهد مثال