#دوال الRegular Expressions والكلمات Regular Expressions تعني سلسلة من الرموز والأحرف التي تعبر عن سلسلة أو نقش ليتم البحث عنها ضمن نص أطول. في هذه المقالة سنغطي الطرق المختلفة التي تعمل مع regexps بتعمق.
str.match(regexp)
تبحث الطريقة str.match (regexp) عن تطابقات لـ regexp في السلسلةstr.
لديها 3 طرق:
-
إذا كان “regexp” لا يحتوي على علامة
نقشg: g، فإنه يُرجع المطابقة الأولى كمصفوفة مع مجموعات التقاط وخصائصindex(موضع المطابقة) ،الإدخال(سلسلة الإدخال ، يساويstr`):let str = "I love JavaScript"; let result = str.match(/Java(Script)/); alert( result[0] ); // JavaScript (full match) alert( result[1] ); // Script (first capturing group) alert( result.length ); // 2 // Additional information: alert( result.index ); // 7 (match position) alert( result.input ); // I love JavaScript (source string) -
إذا كان “regexp” يحتوي على نمط “flag: g” ، فسيُرجع مصفوفة من جميع المطابقات على شكل سلاسل ، دون التقاط مجموعات وتفاصيل أخرى.
let str = "I love JavaScript"; let result = str.match(/Java(Script)/g); alert( result[0] ); // JavaScript alert( result.length ); // 1 -
إذا لم تكن هناك تطابقات ، بغض النظر عما إذا كان هناك علامة
gأم لا ، فسيتم إرجاعnull.
هذا فارق بسيط مهم. إذا لم تكن هناك تطابقات ، فلن نحصل على مصفوفة فارغة ، ولكن لاغية. من السهل ارتكاب خطأ نسيان ذلك ، على سبيل المثال:
```js run
let str = "I love JavaScript";
let result = str.match(/HTML/);
alert(result); // null
alert(result.length); // Error: Cannot read property 'length' of null
```
إذا أردنا أن تكون النتيجة مصفوفة ، فيمكننا الكتابة على النحو التالي:
```js
let result = str.match(regexp) || [];
```
str.matchAll(regexp)
الطريقة str.matchAll (regexp) هي متغير “أحدث ، ومحسن” لـ “str.match”.
يتم استخدامه بشكل أساسي للبحث عن جميع التطابقات مع جميع المجموعات.
هناك 3 اختلافات عن “المباراة”:
- تقوم بإرجاع كائن قابل للتكرار مع تطابقات بدلاً من صفيف. يمكننا عمل مصفوفة منتظمة منه باستخدام
Array.from. - يتم إرجاع كل تطابق كمصفوفة مع مجموعات التقاط (نفس تنسيق
str.matchبدون علامةg). - إذا لم تكن هناك نتائج ، فإنها لا تُرجع “null” ، ولكنها تُرجع كائنًا فارغًا قابلًا للتكرار.
مثال للاستخدام:
let str = '<h1>Hello, world!</h1>';
let regexp = /<(.*?)>/g;
let matchAll = str.matchAll(regexp);
alert(matchAll); // [object RegExp String Iterator], not array, but an iterable
matchAll = Array.from(matchAll); // array now
let firstMatch = matchAll[0];
alert( firstMatch[0] ); // <h1>
alert( firstMatch[1] ); // h1
alert( firstMatch.index ); // 0
alert( firstMatch.input ); // <h1>Hello, world!</h1>
إذا استخدمنا “for…of” للتكرار فوق تطابقات matchAll ، فلن نحتاج بعد ذلك إلى" Array.from` ".
str.split(regexp|substr, limit)
تقسيم السلسلة باستخدام regexp (أو سلسلة فرعية) كمحدد.
يمكننا استخدام الانقسام مع السلاسل ، مثل هذا:
alert('12-34-56'.split('-')) // array of ['12', '34', '56']
لكن يمكننا تقسيمها بتعبير عادي ، بالطريقة نفسها:
alert('12, 34, 56'.split(/,\s*/)) // array of ['12', '34', '56']
str.search(regexp)
تعرض الطريقة str.search (regexp) موضع التطابق الأول أو -1 إذا لم يتم العثور على:
let str = "A drop of ink may make a million think";
alert( str.search( /ink/i ) ); // 10 (first match position)
** القيد المهم: “البحث” يعثر على المطابقة الأولى فقط. **
إذا احتجنا إلى مواضع لمطابقات أخرى ، فيجب أن نستخدم وسائل أخرى ، مثل العثور عليها جميعًا باستخدام str.matchAll (regexp).
str.replace(str|regexp, str|func)
هذه طريقة عامة للبحث والاستبدال ، واحدة من أكثرها فائدة. سكين الجيش السويسري للبحث والاستبدال.
يمكننا استخدامه بدون regexps للبحث عن سلسلة فرعية واستبدالها:
// replace a dash by a colon
alert('12-34-56'.replace("-", ":")) // 12:34-56
هناك مأزق بالرغم من ذلك.
** عندما تكون الوسيطة الأولى لـ replace عبارة عن سلسلة ، فإنها تحل محل المطابقة الأولى فقط. **
يمكنك أن ترى ذلك في المثال أعلاه: فقط أول “” – “” يتم استبداله بـ “”: “”.
للعثور على جميع الواصلات ، لا نحتاج إلى استخدام السلسلة “” – "، ولكن نمط regexp: / – / g، مع العلامة pattern: g` الإلزامية:
// replace all dashes by a colon
alert( '12-34-56'.replace( /-/g, ":" ) ) // 12:34:56
الُمدخَل الثاني هو سلسلة بديلة. يمكننا استخدام حروف خاصة فيه:
| الرموز | الإجراء في سلسلة الاستبدال |
|---|---|
$& |
إدراج التطابق كاملا |
|$`|إدراج جزء من السلسلة قبل التطابق
|
|$'|إدراج جزء من السلسلة بعد المباراة
|
|$n|إذا كان n رقمًا مكونًا من رقم أو رقمين ، يتم إدراج محتويات مجموعة الالتقاط n ، للحصول على التفاصيل ، راجع [] (info: regexp-groups)|
|$<name>|إدراج محتويات الأقواس مع “الاسم” المحدد ، للحصول على التفاصيل ، انظر [] (info: regexp-groups)|
|$$|إدراج حرف $ |
فمثلا:
let str = "John Smith";
// swap first and last name
alert(str.replace(/(john) (smith)/i, '$2, $1')) // Smith, John
** بالنسبة للمواقف التي تتطلب بدائل “ذكية” ، يمكن أن تكون الوسيطة الثانية دالة. **
سيتم استدعاؤها لكل مباراة ، وسيتم إدراج القيمة المرتجعة كبديل.
يتم استدعاء الوظيفة مع الوسيطات func (match، p1، p2، ...، pn، offset، input، groups):
- “المباراة” – المباراة ،
p1، p2، ...، pn– محتويات مجموعات الالتقاط (إن وجدت) ،- “تعويض” – موقع المباراة ،
- “الإدخال” – سلسلة المصدر ،
المجموعات– كائن له مجموعات مسماة.
إذا لم تكن هناك أقواس في regexp ، فهناك 3 وسيطات فقط: func (str ، offset ، input).
على سبيل المثال ، دعنا نطابق جميع المطابقات بأحرف كبيرة: