正则表达式

下列是 Ruby 支持的正则表达式记号(元字符)列表。

这就是元字符的规则。

后位引用

正则表达式的 \1 \2 ... \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

后位引用所对应的括号的必须比在后位引用左边。

若是后位引用包含在所对应的括号内,一定会匹配失败。 另外,若是一个一位数的后位引用没有对应的括号也会匹配失败。

p /(\1)/ =~ "foofoofoo" # => nil
p /(foo)\2/ =~ "foo\2"  # => nil

虽然可以指定大于两位数的后位引用,但是千万不要与转义符的 \nnn(对应八进制 nnn 的字符)搞混。若其数值为单位数,则是后位引用。若是没有匹配的括号,大于二位数的数字就会视为八进制代码。

同样若在正则表达式中使用 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]/ 来表示从 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(简化的字符集写法)。

请注意:由于反相匹配的关系,下面的字符集可匹配换行符(正则表达式 \W 和 \D 也是一样)。

p /[^a-z]/ =~ "\n"    # => 0