當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir Regex用法及代碼示例


Elixir語言中 Regex 相關用法介紹如下。

為 Elixir 提供正則表達式。

正則表達式基於 PCRE(Perl 兼容正則表達式)並建立在 Erlang 之上:re模塊。更多信息可以在:re 模塊文檔.

Elixir 中的正則表達式可以使用符號~r(參見 Kernel.sigil_r/2 )或~R(參見 Kernel.sigil_R/2 )創建:

# A simple regular expression that matches foo anywhere in the string
~r/foo/

# A regular expression with case insensitive and Unicode options
~r/foo/iu

通過 sigils 創建的正則表達式被預編譯並存儲在 .beam 文件中。請注意,如果您正在預編譯 Elixir,這可能會出現問題,請參閱"Precompilation" 部分了解更多信息。

正則表達式在內部表示為 Regex 結構。因此,隻要需要匹配它們,就可以使用%Regex{}。請記住,所有結構字段都是私有的。也不能保證來自同一來源的兩個正則表達式相等,例如:

~r/(?<foo>.)(?<bar>.)/ == ~r/(?<foo>.)(?<bar>.)/

可能會返回 truefalse,具體取決於您的機器、字節順序、可用優化等。但是,您可以通過訪問 source 字段來檢索已編譯正則表達式的源,然後直接比較它們:

~r/(?<foo>.)(?<bar>.)/.source == ~r/(?<foo>.)(?<bar>.)/.source

修飾符

創建正則表達式時可用的修飾符有:

  • unicode (u) - 啟用 Unicode 特定模式,如 \p 並導致 \w\W\s 等字符類也與 Unicode 匹配(參見下麵 "Character classes" 中的示例)。它期望在匹配時給出有效的 Unicode 字符串

  • caseless (i) - 添加不區分大小寫

  • dotall (s) - 使 dot 匹配換行符並將換行符設置為 anycrlf;根據 :re 文檔,可以通過設置 (*CR)(*LF)(*CRLF)(*ANY) 來覆蓋新行設置

  • multiline (m) - 使^$ 標記每一行的開始和結束;使用 \A\z 匹配字符串的結尾或開頭

  • extended (x) - 空白字符被忽略,除非轉義並允許 # 分隔注釋

  • firstline (f) - 強製未錨定模式在第一個換行符之前或處匹配,盡管匹配的文本可能會在換行符上繼續

  • ungreedy (U) - 反轉正則表達式的 "greediness"(以前的 r 選項已棄用,取而代之的是 U )

不可用的選項有:

  • anchored - 不可用,請改用 ^\A
  • dollar_endonly - 不可用,請改用 \z
  • no_auto_capture - 不可用,請改用 ?:
  • newline - 不可用,根據 :re 文檔在正則表達式的開頭使用 (*CR)(*LF)(*CRLF)(*ANYCRLF)(*ANY)

捕獲

此模塊中的許多函數通過 :capture 選項處理在正則表達式匹配中捕獲的內容。支持的值為:

  • :all - 所有捕獲的子模式,包括完整的匹配字符串(這是默認值)

  • :first - 隻有第一個捕獲的子模式,它始終是字符串的完整匹配部分;所有顯式捕獲的子模式都被丟棄

  • :all_but_first - 除了第一個匹配的子模式之外的所有子模式,即所有顯式捕獲的子模式,但不是字符串的完整匹配部分

  • :none - 根本不返回匹配的子模式

  • :all_names - 將正則表達式中的所有命名子模式匹配捕獲為按子模式名稱按字母順序排列的列表

  • list(binary) - 要捕獲的命名捕獲列表

字符類

正則表達式支持幾個內置的命名字符類。這些通過將類名包含在組內的[: :] 中來使用。例如:

iex> String.match?("123", ~r/^[[:alnum:]]+$/)
true
iex> String.match?("123 456", ~r/^[[:alnum:][:blank:]]+$/)
true

支持的類名是:

  • alnum - 字母和數字
  • 阿爾法 - 字母
  • 空白 - 僅空格或製表符
  • cntrl - 控製字符
  • digit - 十進製數字(與 \d 相同)
  • graph - 打印字符,不包括空格
  • lower - 小寫字母
  • print - 打印字符,包括空格
  • punct - 打印字符,不包括字母、數字和空格
  • 空格 - 空格(與 PCRE 8.34 中的 \s 相同)
  • upper - 大寫字母
  • word - "Word" 個字符(與 \w 相同)
  • xdigit - 十六進製數字

還有另一個字符類 ascii 錯誤地匹配 Latin-1 字符而不是 POSIX 指定的 0-127 範圍。如果不改變其他類的行為,就無法解決此問題,因此我們建議將範圍與 [\\0-\x7f] 匹配。

請注意,這些類的行為可能會根據 Unicode 和其他修飾符而改變:

iex> String.match?("josé", ~r/^[[:lower:]]+$/)
false
iex> String.match?("josé", ~r/^[[:lower:]]+$/u)
true
iex> Regex.replace(~r/\s/, "Unicode\u00A0spaces", "-")
"Unicode spaces"
iex> Regex.replace(~r/\s/u, "Unicode\u00A0spaces", "-")
"Unicode-spaces"

預編譯

使用 sigil 構建的正則表達式被預編譯並存儲在 .beam 文件中。預編譯的正則表達式將在運行時進行檢查,並且可能在操作係統和 OTP 版本之間運行較慢。這幾乎不是問題,因為在開發過程中共享的大多數 Elixir 代碼都是在目標上編譯的(例如依賴項、存檔和 escripts),並且在生產中運行時,代碼必須在目標上編譯(通過 mix compile 或類似)或在主機上發布(通過mix releases 或類似)以匹配的 OTP、操作係統和架構作為目標。

如果您知道您在與當前係統不同的係統上運行並且您正在使用正則表達式進行多次匹配,您可以手動調用 Regex.recompile/1 Regex.recompile!/1 來執行運行時版本檢查並在必要時重新編譯正則表達式。

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Regex。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。