كيف تستخدم أداة اختبار Regex
- أدخل النمط دون الشرطتين المائلتين المحيطتين به، مثل
\d{3}-\d{4}. - فعّل الأعلام (flags) التي تحتاجها (
gوiوmوsوuوy). - الصق نص الاختبار. تُظلَّل المطابقات مباشرةً وتُسرد كل مجموعة التقاط.
- يمكنك اختياريًا إدخال نص استبدال، مستخدمًا
$1أو$<name>للمجموعات، لمعاينة النتيجة.
تستخدم الأداة محرك Regex الخاص بـ JavaScript في متصفحك. تبقى أنماطك وبيانات الاختبار على جهازك ولا تُرفع ولا تُخزَّن.
نظرة سريعة على صياغة Regex في JavaScript
تختلف نكهات التعابير النمطية من لغة إلى أخرى. تستخدم هذه الأداة نكهة JavaScript (ECMAScript)، فتطابق النتائج ما تفعله RegExp وString.prototype.match وreplace في المتصفحات وNode.js. تنتقل معظم الصياغة إلى Python وPCRE وJava، لكن تفاصيل مثل صياغة المجموعات المسماة ودعم lookbehind تختلف.
الأعلام (Flags)
| العلم | الاسم | التأثير |
|---|---|---|
g | global | إيجاد كل المطابقات بدلًا من التوقف بعد الأولى. |
i | ignoreCase | مطابقة لا تفرّق بين الأحرف الكبيرة والصغيرة. |
m | multiline | يطابق ^ و$ بداية كل سطر ونهايته. |
s | dotAll | يطابق . فواصل الأسطر أيضًا. |
u | unicode | معاملة النمط على أنه نقاط رمز Unicode؛ ويفعّل تسلسلات الخصائص \p{...}. |
y | sticky | المطابقة عند الموضع المحدد في lastIndex فقط. |
اللبنات الأساسية
- فئات الأحرف:
[abc]، والنطاقات[a-z]، والنفي[^0-9]، والاختصارات\d(رقم) و\w(حرف كلمة) و\s(مسافة بيضاء) ونقائضها\Dو\Wو\S. وبدون العلمu، يغطي\wو\dأحرف ASCII فقط. - المُكمِّمات (Quantifiers):
*(0 أو أكثر)، و+(1 أو أكثر)، و?(0 أو 1)،{n}و{n,}و{n,m}. أضف?لجعلها كسولة:.*?. - المجموعات:
(...)تلتقط، و(?:...)تجمّع دون التقاط، و(?<year>\d{4})تنشئ مجموعة مسماة، و\1أو\k<year>تشير إليها. - المراسي (Anchors):
^و$وحد الكلمة\b. - الاستشرافات (Lookarounds):
(?=...)استشراف أمامي إيجابي، و(?!...)استشراف أمامي سلبي، و(?<=...)استشراف خلفي إيجابي، و(?<!...)استشراف خلفي سلبي. وهي تختبر السياق دون استهلاك أحرف.
// مبالغ الأسعار المسبوقة بعلامة الدولار، بدون العلامة
/(?<=\$)\d+(?:\.\d{2})?/g "Total: $42.50" → "42.50"
// إعادة تنسيق التواريخ بمجموعات مسماة
"2024-03-15".replace(/(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/, "$<d>.$<m>.$<y>")
// "15.03.2024"
أنماط شائعة
| الغرض | النمط | القيود |
|---|---|---|
| البريد الإلكتروني (بسيط) | ^[^\s@]+@[^\s@]+\.[^\s@]+$ | فحص سريع للمعقولية فقط. صياغة العنوان الكاملة أعقد بكثير؛ تأكد بإرسال رسالة بريد. |
| عنوان IPv4 | ^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$ | يرفض الأجزاء التي تتجاوز 255 والأصفار البادئة. لا يتعامل مع IPv6. |
| التاريخ (YYYY-MM-DD) | ^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$ | يقبل تواريخ مستحيلة مثل 2023-02-31. تحقق باستخدام مكتبة تواريخ. |
| عنوان URL (http/https) | ^https?:\/\/[^\s/$.?#][^\s]*$ | فحص متساهل. استخدم الدالة البانية URL للتحليل الفعلي. |
أما لعناوين IP تحديدًا، فإن محوّل عناوين IP يحلل ويحوّل كلًا من IPv4 وIPv6.
مزالق
التراجع الكارثي (Catastrophic backtracking)
يمكن أن تدفع المُكمِّمات المتداخلة أو المتراكبة محركًا يعتمد على التراجع مثل محرك JavaScript إلى تجربة عدد أسّي من المسارات عند فشل المطابقة. وقد تكفي بضع عشرات من الأحرف لتجميد علامة تبويب في المتصفح، أو لتمكين هجوم حجب الخدمة (ReDoS) على الخادم:
/^(a+)+$/.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!") // قد يتجمد
/^a+$/.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!") // فوري
تجنّب أنماطًا مثل (a+)+ أو (a|a)* أو (.*)*، واجعل البدائل متنافية، وكن محددًا: فـ [^"]* أكثر أمانًا من .* داخل علامات الاقتباس.
مزالق أخرى
- يتذكر تعبير regex ذو العلم
gقيمةlastIndex، فاستدعاءtest()مرارًا على الكائن نفسه يتناوب بينtrueوfalse. - عند بناء نمط من نص، يجب مضاعفة الشرطات المائلة العكسية:
new RegExp("\\d+"). - نسيان
^و$يعني أن أداة التحقق تقبل أي مدخل يحتوي على مطابقة فحسب.
الأسئلة الشائعة
لماذا يعمل Regex الخاص بي هنا ولا يعمل في Python أو PHP؟
تختلف النكهات. تكتب Python المجموعات المسماة بالشكل (?P<name>...) وتدعم lookbehind ذا العرض الثابت فقط؛ بينما تحيط PCRE في PHP الأنماط بمحدِّدات. وتختلف أيضًا قواعد الهروب في النصوص الحرفية بين اللغات.
ما الفرق بين المُكمِّمات الجشعة والكسولة؟
تطابق المُكمِّمات الجشعة (.*) أكبر قدر ممكن ثم تتراجع؛ أما الكسولة (.*?) فتطابق أقل قدر ممكن. على <b>x</b>، يطابق <.*> النص كله بينما يطابق <.*?> العنصر <b> فقط.
هل تدعم JavaScript خاصية lookbehind؟
نعم، منذ ES2018، وعلى خلاف كثير من المحركات فهي تسمح باستشراف خلفي متغير الطول. وتدعمه كل المتصفحات الرئيسية الحالية.
كيف أطابق نقطة أو قوسًا حرفيًا؟
اهرب منه بشرطة مائلة عكسية: \. أو \[ أو \(. وداخل فئة الأحرف تكون معظم الرموز حرفية، لذا فإن [.] يطابق نقطة أيضًا.
آخر تحديث