温馨提醒:系统正在全面升级。您可以访问最新站点。谢谢!
m 回以上、最大 n 回
(尽量匹配短的部分)。
?
负责指定数量(quantifiers)。表示前面子表达式至多出现 1 次。
??
负责指定数量(quantifiers)。表示前面子表达式至多出现 1 次(尽量匹配短的部分)。
|
选择(alternative)。
( )
正则表达式的群组化。与括号中的正则表达式相匹配的字符串将被保存下来,供后向引用使用。
\1, \2 ... \n
后向引用(back reference)。请参考后向引用。
(?# )
注释。括号中的任意字符串将被忽视。
(?: )
不具备后向引用功能的群组化。它不为 \1,\2(或 $1,$2)提供服务,是一种单纯的群组功能。
/(abc)/ =~ "abc"
p $1
=> "abc"
/(?:abc)/ =~ "abc"
p $1
=> nil
(?= )
先行(lookahead)。使用 pattern 指定位置(不留间隔)。
(?=re1)re2
表示同时匹配 re1 和 re2 的正则表达式。
re1(?=re2)
表示在后面紧跟着匹配 re2 字符串的正则表达式 re1。
p /foo(?=bar)/ =~ "foobar" # => 0
p $& # => "foo" (没有 bar 部分的信息)
(?! )
否定先行(negative lookahead)。使用否定的 pattern 来指定位置(不留间隔)。
(?!re1)re2
表示不匹配 re1 匹配 re2 的正则表达式。
# 除 000 以外的 3 位数字
re = /(?!000)\d\d\d/
p re =~ "000" # => nil
p re =~ "012" # => 0
p re =~ "123" # => 0
# C 语言标识符(首位是[A-Za-z_]然后是[0-9A-Za-z_]的字符串)
/\b(?![0-9])\w+\b/
(?ixm-ixm)
正则表达式中的 i 选项、x 选项、m 选项的开关。请您参考正则表达式字面值来了解选项的详细内容。
re = /A(?i)a(?-i)A/
p re =~ "AaA" # => 0
p re =~ "AAA" # => 0
p re =~ "AAa" # => nil
(?ixm-ixm: )
括号中的 i 选项、x 选项、m 选项的开关。在括号范围内有效。
re = /A(?i:a)A/
p re =~ "AaA" # => 0
p re =~ "AAA" # => 0
p re =~ "AAa" # => nil
后向引用正则表达式 \1 \2 ... \n 表示后向引用。\n 表示将匹配第 n 个括号(正则表达式的()表示群)的内容保存起来,供后面使用。
/((foo)bar)\1\2/
和
/((foo)bar)foobarfoo/
是一样的。
例子:
re = /(foo|bar|baz)\1/
p re =~ 'foofoo' # => 0
p re =~ 'barbar' # => 0
p re =~ 'bazbaz' # => 0
p re =~ 'foobar' # => nil
对应的括号必须位于后向引用表达式的左侧。
若后向引用表达式位于对应的括号中时,匹配常常会失败。当后向引用表达式中的数字是 1 位,且没有对应的括号时,匹配也将失败。
p /(\1)/ =~ "foofoofoo" # => nil
p /(foo)\2/ =~ "foo\2" # => nil
虽然可以指定 2 位以上的后向引用表达式,但是不要把它同控制码的 \nnn(对应于八进制数 nnn 的字符)混为一谈。当数字只有 1 位时,通常是后向引用表达式。当指定了一个超过 2 位的数字时,若没有对应括号的话,则被看作是八进制代码。
相反地,若在正则表达式中使用 1 位的八进制代码时,必须以 0 打头,例如 \01 等(不可能存在形如 \0 这样的后向引用表达式,因此不会混淆)。
p /\1/ =~ "\1" # => nil # 无对应括号的后向引用
p /\01/ =~ "\1" # => 0 八进制代码
p /\11/ =~ "\11" # => 0 八进制代码
# 八进制代码(因为没有对应括号)
p /(.)\10/ =~ "1\10" # => 0
# 后向引用(因为有对应的括号)
p /((((((((((.))))))))))\10/ =~ "aa" # => 0
# 八进制代码(因为没有像 "\0" + "8" -> \08 这样的八进制代码)
p /(.)\08/ =~ "1\0008" # => 0
# 如果想在后向引用表达式之后插入数字的话,就必须使用括号加以分隔。
p /(.)(\1)1/ =~ "111" # => 0
字符簇正则表达式 [] 负责指定字符簇。这将匹配 [] 内列出的任何一个字符。
例如 /[abc]/ 表示只要匹配 "a"、"b"、"c" 中任何一个即可。也可以按照 ASCII 代码顺序,在连续的字符串之间插入“-”后写成 /[a-c]/ 也是一样的效果。另外,若开头是“^”的话,表示要匹配指定字符之外的一个字符。
若“^”不在开头的话,表示匹配该字符本身。同时,当“-”出现在头或尾上时,表示匹配该字符本身。
p /[a^]/ =~ "^" # => 0
p /[-a]/ =~ "-" # => 0
p /[a-]/ =~ "-" # => 0
p /[-]/ =~ "-" # => 0
空的字符簇将会引发错误。
p /[]/ =~ ""
p /[^]/ =~ "^"
# => invalid regular expression; empty character class: /[^]/
当“]”出现在开头(或否定的“^”之后)时,表示“]”本身,而并非字符范围的结尾。这样的“]”推荐使用反斜线符号进行转义。
p /[]]/ =~ "]" # => 0
p /[^]]/ =~ "]" # => nil
可以使用反斜线符号对 "^"、"-"、"]" 以及 "\\"(反斜线符号)进行转义,使其匹配该字符本身。
p /[\^]/ =~ "^" # => 0
p /[\-]/ =~ "-" # => 0
p /[\]]/ =~ "]" # => 0
p /[\\]/ =~ "\\" # => 0
在 [] 中同字符串一样可以使用控制码,以及正则表达式 \w、\W、\s、\S、\d、\D(这些都是表示字符簇的简写法)。