التعبيرات العادية هي أنماط توفر طريقة فعالة للبحث والاستبدال في النص.
في ال JavaScript, أنها تكون متوفرة عبر RegExp, وكذلك يمكن دمجها في طرق النصوص.
التعبيرات المنتظمة
النعبير المنتظم (ويمكن أختصاره الي “regexp”, او “reg”) يتكون من نمط وأعلام أختيارية.
هناك نوعان من بناء الجملة يمكن استخدامهما لإنشاء كائن تعبير منتظم.
طريقة الكتابة “الطويلة”:
regexp = new RegExp('نمط', 'أعلام');
وطريقة الكتابة “القصيرة”, بأستخدام “/”:
regexp = /نمط/; // بدون أعلام
regexp = /نمط/gim; // أستخدام الاعلام g,m والعلم i (سيتم تغطيته فيما بعد)
هذا الرمز “/…/” يعرف ال JavaScript أننا سننشئ تعبير منتظم. وهي كذلك مثل علامات التنصيص في النصوص.
في الحالتين يصبح ال regexp
نموذج مبني من ال RegExp
.
الأختلاف الرئيسي بين الطريقتين أن النمط بأستخدام ال /.../
لا يسمح لك بكتابة تعبيرات بداخله (مثل التعبير ${...}
). في هذه الحاله تكون الجمله ثابتة.
Slashes are used when we know the regular expression at the code writing time – and that’s the most common situation. While new RegExp
is more often used when we need to create a regexp “on the fly” from a dynamically generated string. For instance:
let tag = prompt('ما العلامة التي تريد العثور عليها؟', 'h2');
let regexp = new RegExp(`<${tag}>`); // مثل /<h2>/ أذا أُجيب "h2" في prompt أعلاه
الأعلام
التعبيرات المنتظمة ربما تحتوي علي أعلام تؤثر في البحث.
هناك فقط 6 منهم في ال JavaScript:
i
- عند أستخدام هذا العلم. البحث لا يهتم بحالة الاحرف. فلا أختلاف بين ال
A
والa
(أنظر للمثال بالأسفل). g
- باستخدام هذه العلامة ، يبحث البحث عن جميع التطابقات ، بدونها – يتم إرجاع المطابقة الأولى فقط
m
- وضع متعدد الاسطر (تم تغطيتها في الفصل Multiline mode of anchors ^ $, flag "m").
s
- يمكننا وضع ال “dotall”, يسمح النقطة
.
لمطابقة السطر الجديد\n
(تم تغطيته في الفصل فئات الأحرف). u
- Enables full Unicode support. The flag enables correct processing of surrogate pairs. More about that in the chapter Unicode: flag "u" and class \p{...}.
y
- وضع ال “Sticky”: يبحث عن الموضع في النص (تم تغطيتها في الفصل علم ثابت "y" ، البحث في الموضع)
من هنا في نظام الألوان:
- التعبير المنتظم –
red
- النص (حيث نبحث) –
blue
- النتيجة –
green
البحث بأستخدام: str.match
كما ذكرنا سابقًا ، يتم دمج التعبيرات المنتظمة مع وظائف النص.
الوظيفة str.match(regexp)
تجد كل ما يحتوي علي regexp
في النص str
.
لديها 3 طرق عمل:
-
أذا كان التعبير المنتظم يحتوي علي العلم
g
, تقوم بإرجاع مجموعة من كافة التطابقات:let str = 'We will, we will rock you'; alert(str.match(/we/gi)); // We,we (مصفوفة من نصين متطابقين)
من فضلك انتبه ان كلا من ال
We
والwe
تم أيجادهم, لان العلمi
يجعل التعبير المنتظم لا يهتم بحالة الاحرف. -
إذا لم يكن هناك مثل هذا العلم ، فإنه يُرجع المطابقة الأولى فقط في شكل مصفوفة ، مع المطابقة الكاملة في الفهرس
0
وبعض التفاصيل الإضافية في الخصائص:let str = 'We will, we will rock you'; let result = str.match(/we/i); // بدون العلم g alert(result[0]); // We (المتطابقة الاولي) alert(result.length); // 1 // االتفاصيل: alert(result.index); // 0 (موضع الجزء الذي تم البحث عنه) alert(result.input); // We will, we will rock you (النص)
قد تحتوي المصفوفة على فهارس أخرى ، إلى جانب
0
إذا تم تضمين جزء من التعبير المنتظم بين قوسين. سنتناول ذلك في الفصل التقاط المجموعات. -
وأخيراُ, أذا كان هناك ولا متطابقة, فأن الناتج يكون
null
(لا يهم أذا كان يوجد العلمg
او لا يوجد).هذا فارق بسيط مهم للغاية. إذا لم تكن هناك تطابقات ، فلن نتلقى مصفوفة فارغة ، ولكن بدلاً من ذلك نتلقى
null
. قد يؤدي نسيان ذلك إلى حدوث أخطاء ، على سبيل المثال:let matches = 'JavaScript'.match(/HTML/); // = null if (!matches.length) { // خطأ: لا يمكن قراءة الخاصية 'length' لدي null alert('خطأ في السطر الأعلي'); }
إذا أردنا أن تكون النتيجة دائمًا مصفوفة ، فيمكننا كتابتها بهذه الطريقة:
let matches = "JavaScript".match(/HTML/) || []; if (!matches.length) { alert("لا متطابقات"); // الأن أنها تعمل }
الأستبدال: str.replace
الوظيفة str.replace(regexp, replacement)
تستبدل المتطابقات التي يتم أيجادها بأستخدام ال regexp
في النص str
مع كلمة replacement
(كل المتطابقات يتم أستبدالها أذا كان هنالك العلم g
, غير ذلك, يتم أستبدال المتطابقة الاولي فقط).
علي سبيل المثال:
// بدون العلم g
alert('We will, we will'.replace(/we/i, 'I')); // I will, we will
// مع أستخدام العلم g
alert('We will, we will'.replace(/we/gi, 'I')); // I will, I will
العنصر الثاني يكون النص replacement
. يمكننا استخدام تركيبات أحرف خاصة لإدراج أجزاء من المتطابقة:
الرموز | الاجراء في نص الأستبدال |
---|---|
$& |
إدراج المتطابقة كاملة |
$` |
أدراج جزء من النص قبل المتطابقة |
$' |
أدراج جزء من النص بعد المتطابقة |
$n |
أذا n تكون رقم او رقمين, ثم يدرج محتويات الأقواس رقم n ، المزيد عنها في الفصل التقاط المجموعات |
$<name> |
يدرج محتويات الأقواس مع “الاسم” المحدد ، المزيد عنه في الفصل التقاط المجموعات |
$$ |
أدراج حرف $ |
مثال علي $&
:
alert('أنا أحب HTML'.replace(/HTML/, '$& and JavaScript')); // أنا أحب HTML and JavaScript
الأختبار: regexp.test
الوظيفة regexp.test(str)
يبحث عن تطابق واحد على الأقل, أذا وُجد, يكون الناتج او العائد true
, غير ذلك false
.
let str = 'أنا أحب JavaScript';
let regexp = /أحب/i;
alert(regexp.test(str)); // true
لاحقًا في هذا الفصل ، سندرس تعبيرات أكثر انتظامًا ، وسنتعرف على المزيد من الأمثلة ، ونلتقي أيضًا بطرق أخرى.
يتم توفير معلومات كاملة عن الأساليب في المقالة .
الملخص
- يتكون التعبير المنتظم من نمط وأعلام اختيارية:
g
,i
,m
,u
,s
,y
. - بدون أعلام او رموز خاصة (ذلك سوف ندرسه لاحقاً), البحث عن طريق regexp هو نفسه البحث عن سلسلة فرعية.
- الوظيفة
str.match(regexp)
يبحث عن المتطابقات: كلها إن وجدتg
علم, غير ذلك, فقط المتطابقة الاولي. - الوظيفة
str.replace(regexp, replacement)
تستبدل المتطابقات التي توجد بأستخدامregexp
معreplacement
: كلهم أن تم أيجادهمg
علم, غير ذلك الاولي فقط. - الوظيفة
regexp.test(str)
تُعيد لناtrue
أذا كان هناك علي الاقل متطابقة واحدة, غير ذلك, تُعيد لناfalse
.
التعليقات
<code>
، وللكثير من السطور استخدم<pre>
، ولأكثر من 10 سطور استخدم (plnkr, JSBin, codepen…)