التعبيرات النمطية (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!"