跳至内容

正则表达式

正则表达式由 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">

百分比正则表达式字面量

除了斜杠分隔的字面量之外,正则表达式还可以用 %r 表示的百分比字面量和一对分隔符来表示。有效分隔符是括号 ()、方括号 []、花括号 {}、尖括号 <> 和管道 ||。除了管道之外,所有分隔符都可以嵌套;这意味着字面量中的开始分隔符会转义下一个结束分隔符。

这些对于编写包含斜杠的正则表达式很有用,而斜杠分隔的字面量中需要对其进行转义。

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