軌道
/
Elixir
Elixir
/
課程大綱
/
正規表示式
正規

正規表示式 在 Elixir

24 個練習

關於 正規表示式

正規表示式(regex)是 Elixir 中處理字串的強大工具。Elixir 的正規表示式遵循PCRE規範(Perl Compatible Regular Expressions)。代表正規表示式意義的字串模式會先經過編譯,再用來比對整個字串或字串的一部分。

在 Elixir 中,建立正規表示式最常見的方式是使用 ~r sigil。Sigil 為 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。

動態建立正規表示式

因為~r sigil 是"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 個練習,就能練習 正規表示式