«عبارتهای باقاعده» ابزاری قدرتمند برای کار با رشتهها در Elixir هستند. عبارتهای باقاعده در Elixir از مشخصات PCRE (عبارتهای باقاعدهی سازگار با Perl) پیروی میکنند. الگوهای رشتهای که معنای عبارت باقاعده را نشان میدهند، ابتدا کامپایل میشوند و سپس برای تطبیق همه یا بخشی از یک رشته استفاده میشوند.
در 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"]
گرفتنها شمارهگذاری میشوند (از ۱ شروع میشود) و میتوانند در نتیجه نیز هنگام جایگزینی بخشهایی از یک رشته با عبارت باقاعده استفاده شوند:
Regex.replace(~r/Weight: (\d*)g/, "Weight: 150g", "Gewicht: \\1g")
# => "Gewicht: 150g"
گرفتنها را میتوان با افزودن ?<name> بعد از پرانتز باز نیز اسمگذاری کرد. برای گرفتن یک map با گرفتنهایی که اسم دارند از 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!"