正则表达式¶
正则表达式由 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|/| # => /\//