المسارات
/
Elixir
Elixir
/
المنهج
/
التعبيرات النمطية
ال

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

24 تمرينًا

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

التعبيرات النمطية (regex) أداة قوية للتعامل مع السلاسل النصية في Elixir. تتبع التعبيرات النمطية في Elixir مواصفة PCRE (Perl Compatible Regular Expressions). تُصرَّف أنماط السلاسل النصية التي تمثل معنى التعبير النمطي أولًا، ثم تُستخدم لمطابقة سلسلة نصية كاملة أو جزء منها.

في Elixir، الأسلوب الأكثر شيوعًا لإنشاء التعبيرات النمطية هو استخدام سيجيل ~r. توفر السيجيلات اختصارات السكر النحوي للمهام الشائعة في Elixir. في هذه الحالة، ~r اختصار لاستخدام Regex.compile!/2.

Regex.compile!("test") == ~r/test/
# => true

العامل =~/2 مفيد لإجراء مطابقة تعبير نمطي على سلسلة نصية وإرجاع نتيجة boolean.

"this is a test" =~ ~r/test/
# => true

مراجعة صياغة التعبيرات النمطية

  • بعض الأحرف في نمط التعبير النمطي لها معنى خاص، ولاستخدام الحرف استخدامًا حرفيًا يجب تهريبه بـ \، مثل ~r/\?/.
  • فئات الأحرف (مثل \d و \w) تتيح للأنماط مطابقة مجموعة من الأحرف
  • البدائل (|) تتيح للأنماط مطابقة نمط أو آخر
  • المكمّمات ({N, M}، *، ?) تتيح للأنماط مطابقة عدد محدد من الأنماط المتكررة
  • المجموعات (()) تتيح لأجزاء من الأنماط أن تعمل كوحدة واحدة

الالتقاط

التعبيرات النمطية مفيدة أيضًا لاستخراج جزء من سلسلة نصية. ويُسمّى هذا الالتقاط. لالتقاط جزء من سلسلة نصية، أنشئ مجموعة (()) للجزء الذي تريد التقاطه واستخدم Regex.run.

Regex.run(~r/Weight: (\d*)g/, "Weight: 150g")
# => ["Weight: 150g", "150"]

تُرقَّم الالتقاطات (بدءًا من 1) ويمكن أيضًا استخدامها في النتيجة عند استبدال أجزاء من سلسلة نصية بتعبير نمطي:

Regex.replace(~r/Weight: (\d*)g/, "Weight: 150g", "Gewicht: \\1g")
# => "Gewicht: 150g"

يمكن أيضًا تسمية الالتقاطات بإضافة ?<name> بعد القوس الفاتح. استخدم Regex.named_captures/3 للحصول على خريطة ذات التقاطات مسماة.

Regex.named_captures(~r/Weight: (?<weight>\d*)g/, "Weight: 150g")
# => %{"weight" => "150"}

المعدّلات

يمكن تعديل سلوك التعبير النمطي بإضافة أعلام خاصة في نهاية التعبير النمطي، مثل ~r/test/i.

  • caseless i - غير حساس لحالة الأحرف
    "A" =~ ~r/a/
    # => false
    "A" =~ ~r/a/i
    # => true
    
  • unicode u - يُمكّن أنماط Unicode الخاصة مثل \p ويجعل فئات الأحرف مثل \w وما شابهها تطابق محارف Unicode أيضًا
    "ö" =~ ~r/^\w$/
    # => false
    "ö" =~ ~r/^\w$/u
    # => true
    
  • والمزيد: dotall، multiline، extended، firstline، ungreedy

بناء التعبيرات النمطية ديناميكيًا

لأن سيجيل ~r اختصار لـ "pattern" |> Regex.escape() |> Regex.compile!()، يمكنك أيضًا استخدام إقحام السلاسل النصية لبناء نمط تعبير نمطي ديناميكيًا:

anchor = "$"
regex = ~r/end of the line#{anchor}/
"end of the line?" =~ regex
# => false
"end of the line" =~ regex
# => true

التعبيرات النمطية مقابل وحدة String

على الرغم من أن التعبيرات النمطية قوية، فليس من الحكمة دائمًا استخدامها:

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

كقاعدة عامة، من الأفضل استخدام دوال وحدة String كلما أمكن.

# Don't use regular expressions to check a suffix:
if "YELLING!" =~ ~r/!$/, do: "Whoa, chill out!"

# Use a string function:
if String.ends_with?("YELLING!", "!"), do: "Whoa, chill out!"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

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

التدريب مقفل

افتح 10 تمارين إضافية لممارسة التعبيرات النمطية