跳至內容

正規表示式

正規表示式由 Regex 類別表示。

Regex 通常使用正規表示式字面值,並採用 PCRE2 語法來建立。 它由一串以斜線 (/) 包圍的 UTF-8 字元組成

/foo|bar/
/h(e+)llo/
/\d+/
/あ/

注意

在 Crystal 1.8 之前,編譯器期望正規表示式字面值遵循原始的 PCRE 模式語法。較新的 PCRE2 模式語法1.8 中引入

跳脫字元

正規表示式支援與 字串字面值相同的跳脫序列

/\//         # slash
/\\/         # backslash
/\b/         # backspace
/\e/         # escape
/\f/         # form feed
/\n/         # newline
/\r/         # carriage return
/\t/         # tab
/\v/         # vertical tab
/\NNN/       # octal ASCII character
/\xNN/       # hexadecimal ASCII character
/\x{FFFF}/   # hexadecimal unicode character
/\x{10FFFF}/ # hexadecimal unicode character

分隔符號字元 / 必須在以斜線分隔的正規表示式字面值中跳脫。請注意,如果 PCRE 語法的特殊字元要作為文字字元,則需要跳脫。

插值

插值在正規表示式字面值中的運作方式與在 字串字面值 中相同。請注意,如果產生的字串導致正規表示式無效,則使用此功能將會在執行時期引發例外。

修飾符

結束分隔符號後面可以接著許多可選的修飾符,以調整正規表示式的匹配行為。

  • i:不區分大小寫匹配 (PCRE_CASELESS):模式中的 Unicode 字母會匹配主體字串中的大小寫字母。
  • m:多行匹配 (PCRE_MULTILINE):行首 (^) 和行尾 ($) 元字元會分別匹配主體字串中內部換行符號緊接之後或緊接之前的位置,以及在最開始和最結束的位置。
  • x:擴展的空白匹配 (PCRE_EXTENDED):模式中的大多數空白字元都會被完全忽略,除非被忽略或位於字元類別內。未跳脫的井號字元 # 表示註解的開始,其範圍到該行的結尾。
/foo/i.match("FOO")         # => #<Regex::MatchData "FOO">
/foo/m.match("bar\nfoo")    # => #<Regex::MatchData "foo">
/foo /x.match("foo")        # => #<Regex::MatchData "foo">
/foo /imx.match("bar\nFOO") # => #<Regex::MatchData "FOO">

百分比 Regex 字面值

除了以斜線分隔的字面值之外,正規表示式也可以表示為以 %r 和一對分隔符號表示的百分比字面值。有效的分隔符號為括號 ()、方括號 []、大括號 {}、角括號 <> 和管道 ||。除了管道之外,所有分隔符號都可以巢狀結構;表示字面值內部的起始分隔符號會跳脫下一個結束分隔符號。

這些方便於編寫包含斜線的正規表示式,這些斜線必須在以斜線分隔的字面值中跳脫。

%r((/)) # => /(\/)/
%r[[/]] # => /[\/]/
%r{{/}} # => /{\/}/
%r<</>> # => /<\/>/
%r|/|   # => /\//