مسیر
/
Elixir
Elixir
/
برنامه‌ی درسی
/
عبارات باقاعده
عب

عبارات باقاعده در Elixir

24 تمرین

درباره‌ی عبارات باقاعده

«عبارت‌های باقاعده» ابزاری قدرتمند برای کار با رشته‌ها در 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!"
ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

عبارات باقاعده را یاد بگیرید

تمرین کردن قفل شده است

برای تمرین عبارات باقاعده قفل 10 تمرین دیگر را باز کنید