العرض باللغة العربية التبديل إلى الإنجليزية

مُختبِر التعبيرات النمطية

اختبر تعبيرات JavaScript النمطية مباشرةً. شاهد المطابقات مُميَّزة ومجموعات الالتقاط مُدرجة.

/ /

المطابقات المُميَّزة

 

المطابقات والمجموعات

  1. اكتب نمط التعبير في الحقل أعلاه (دون الحاجة إلى تطويقه بشرطات مائلة).
  2. فعّل الأعلام التي تريد: g لكل المطابقات، i لتجاهل حالة الأحرف، وهكذا.
  3. ألصق أو اكتب النص المراد اختباره في مربع "نص الاختبار".
  4. ستتلوّن المطابقات فورًا؛ راجع مجموعات الالتقاط في الجدول أسفل.
ماذا تفعل؟

يُشغّل هذا المُختبِر نمطك على نص الاختبار عبر محرك RegExp المدمج في المتصفح — نفس المحرك الذي تستخدمه Node.js وDeno وكل المتصفحات. تُميَّز المطابقات مباشرة. تُستخرج مجموعات الالتقاط المرقّمة والمُسمّاة إلى جدول لترى بدقة ما التقطه كل قوسين.

مثال

النمط (مع علم g):

\b(\w+)@(\w+\.\w+)\b

نص الاختبار:

Contact us at [email protected] or [email protected]. Not an email: foo@bar (no TLD).

المطابقات:

1  [email protected]        $1: hello    $2: example.com
2  [email protected]   $1: support  $2: happycoder.dev

foo@bar لا يُطابق لأن \w+\.\w+ يتطلّب نقطة في اسم النطاق.

لماذا لا يُطابق تعبيري النمطي؟

  • نسيت علم g. بدونه تُعاد أول مطابقة فقط. /cat/.exec("cat cat") يجد "cat" واحدة؛ بينما /cat/g يجدهما كليهما.
  • ميتا-حروف دون تهريب. example.com يُطابق أيضًا examplexcom لأن . يطابق أي حرف. هرّبها: example\.com.
  • المطابقة النهمة تلتهم الكثير. <.*> على <a><b> يلتقط كل شيء. استعمل النمط الكسول <.*?> أو الفئة المنفية <[^>]*> ليتوقف عند أول >.
  • ارتباك مع حدود الكلمات. \b هو موضع بين حرف كلمة وحرف ليس من كلمة. أنماط مثل \bfoo-bar\b تفشل لأن الـ - في الوسط حدٌّ ليس-كلمة بالفعل.
  • اختلاف في حالة الأحرف. [a-z]+ لن يطابق Hello. أضف علم i أو استعمل [A-Za-z]+.
  • ^ / $ لأسطر متعددة. بدون علم m فإنهما يرسوان على بداية ونهاية النص كله فقط، لا كل سطر. فعّل m إذا كنت تفحص أسطر السجلات.
الأسئلة الشائعة

ما نكهة التعبيرات النمطية التي يستخدمها هذا المُختبِر؟

تعبيرات JavaScript (ECMAScript) النمطية عبر محرك RegExp المدمج في المتصفح. يختلف هذا عن PCRE (PHP، Perl)، وعن وحدة re في Python، وعن POSIX في عدة نقاط: لا توجد استدعاءات تعاودية، ولا مكمّمات تملّكية، وتستخدم المجموعات المسمّاة (?<name>...) بدلًا من (?P<name>...)، وتُعامَل اختصارات الفئات مثل \d ككائنات ASCII فقط ما لم تضف علم u.

هل يدعم lookbehind؟

نعم. أضيفت إدّعاءات lookbehind مثل (?<=foo)bar و(?<!foo)bar في ES2018 وتعمل في أحدث إصدارات Chromium وFirefox وSafari. إذا كنت تستهدف متصفحات قديمة جدًا في الإنتاج فتحقّق من caniuse قبل الاعتماد عليها — أما هذا المُختبِر نفسه فيشغّلها دون مشاكل.

ماذا تعني أعلام g وi وm وs وu؟

g يجد كل المطابقات بدلًا من الأولى فقط. i يجعل المطابقة غير حساسة لحالة الأحرف. m يجعل ^ و$ يطابقان بداية ونهاية كل سطر بدلًا من النص كله. s (dotall) يجعل . يطابق أسطرًا جديدة أيضًا. u يُفعّل معالجة Unicode الكاملة وتحليل إفلات أكثر صرامة. اختر ما تحتاجه فقط — g تحديدًا يُغيّر عدد المطابقات التي تحصل عليها.

لماذا يلتقط مكمّمي النهم أكثر من اللازم؟

المكمّمات مثل * و+ و{n,} نهمة افتراضيًا — تلتقط قدر الإمكان ولا تتراجع إلا إذا فشل باقي النمط. أضف ? لتجعلها كسولة: .*? تلتقط الحد الأدنى. الإصلاح الشائع لـ <a>.*</a> الذي يأكل عدة وسوم: استخدم <a>.*?</a> أو الفئة المنفية <a>[^<]*</a>.

كيف أشير إلى مجموعة التقاط لاحقًا داخل النمط أو في الاستبدال؟

داخل النمط استعمل \1 و\2 وغيرها لمطابقة نفس النص الذي التقطته مجموعة سابقة — (\w+)\s+\1 يطابق الكلمات المكرّرة. في نص الاستبدال (غير مدعوم في هذا المُختبِر المباشر، لكن في String.replace) استعمل $1 و$2. المجموعات المسمّاة تستخدم \k<name> داخل النمط و$<name> في الاستبدال.

لماذا ينكسر تعبيري النمطي عندما يحتوي النمط على نقطة أو شرطة مائلة أو قوس؟

هذه ميتا-حروف الـregex. لمطابقتها حرفيًا هرّبها بشرطة مائلة عكسية: \. للنقطة، و\/ للشرطة (اختيارية في سلسلة new RegExp، وإلزامية بين حرفي /.../)، و\( و\) للقوسين. الحروف الخاصة هي . * + ? ^ $ { } ( ) | [ ] \ — أيٌّ منها كحرف حرفي يحتاج إلى تهريب.

هل تحفظون تعبيري النمطي أو نص الاختبار الذي أكتبه هنا؟

لا. لا نحفظ الأنماط التي تكتبها ولا النص الذي تختبره عليها. يُمحى كل ما تكتبه بمجرد إغلاق أو تحديث علامة التبويب — بلا سجلات ولا أي أثر عندنا لما طابقته. إن أردت اطمئنانًا إضافيًا، ستؤكد ذلك أدوات مطوري المتصفح.