下列是 Ruby 支持的正则表达式记号(元字符)列表。
这就是元字符的规则。
^
行首。匹配字符串的开始或换行符之后的位置。
$
行尾。匹配字符串的结尾或换行符之前的位置。
p "\n".gsub(/$/, "o") # => "o\no"
.
除换行符外的任意字符(使用多字节字符时,代表一个字符,而不是一字节)。与正则表达式选项 m(多行模式,参考正则表达式字面值)同用可以匹配包括换行符的任何字符。
p /./ =~ " あ "[0,1] # => 0
\w
字母和数字,与 [0-9A-Za-z_] 相同。
同样可以匹配全角汉字。
\W
非字母数字,\w 以外的字符。
\s
空格符,与 [ \t\n\r\f] 相同。
\S
非空格符,[ \t\n\r\f] 以外的字符。
\d
数字。与 [0-9] 相同。
\D
非数字。
\A
字符串首,与 ^ 不同,不会受换行符影响。
\Z
字符串尾,若字符串以换行符结尾则会匹配换行符前面的位置。
p "\n".gsub(/\Z/, "o") # => "o\no"
\z
字符串尾,与 $ 或 \Z 不同,不会受换行符影响。
\b
在字符集外代表词界(匹配 \w 和 \W 之间),在字符集内代表退格字符 (0x08)。
\B
非词界。
\G
(无间隔)上次匹配的位置(之后)。第一次匹配时匹配字符串首(与 \A 相同)。
可以在 scan 或 gsub 中使用。想要在上次匹配成功的位置之后进行匹配时可以使用。
# 从开始处一次取出3位数字(前提是数字连续) str = "123456 789" str.scan(/\G\d\d\d/) {|m| p m }
[ ]
设置字符集。参考字符集。
*
前面的表达式至少重复 0 次。匹配最长的子字符串。
*?
数量定义词。前面的表达式至少重复 0 次(匹配最短的子字符串)。
+
数量定义词。前面的表达式至少重复 1 次。
+?
数量定义词。前面的表达式至少重复 1 次(匹配最短的子字符串)。
区间定义词(interval quantifier)。前面的正则表达式分别重复:
{,n} 或 {,} 必定匹配失败。
str = "foofoofoo" p str[/(foo){1}/] # => "foo" p str[/(foo){2,}/]# => "foofoofoo" p str[/(foo){1,2}/] # => "foofoo"
正则表达式的 ?、*、+ 分别相当于 {0,1}、{0,}、{1,}。
区间定义词(interval quantifier)。前面的正则表达式分别重复:
匹配最短的子字符串。
?
数量定义词。前面的表达式重复 0 或 1 次。
??
数量定义词。前面的表达式重复 0 或 1 次。(匹配最短的子字符串)
|
选择(alternative)。
( )
将正则表达式分群。匹配括号中正则表达式的子字符串会记忆在后位引用中。
\1, \2 ... \n
后位引用(back reference)。参考后位引用。
(?# )
注释。忽视括号中的所有字符串。
(?: )
无后位引用功能的分群。也就是单纯进行分群,而不会成为后位引用的对象如: \1、\2(以及 $1,$2)等。
/(abc)/ =~ "abc" p $1 => "abc" /(?:abc)/ =~ "abc" p $1 => nil
(?= )
前向匹配(lookahead)。根据正则表达式指定匹配位置(无间隔)。
(?=re1)re2
是表示同时匹配 re1 和 re2 的正则表达式。
而:
re1(?=re2)
是匹配以紧接着匹配 re2 的 re1。
p /foo(?=bar)/ =~ "foobar"# => 0 p $&# => "foo"(没有 bar 部分的信息)
(?! )
否定前向匹配(negative lookahead)。根据模板的反面指定匹配位置(无间隔)。
(?!re1)re2
上述正则表达式匹配不匹配 re1,但匹配 re2 的字符串。
# 一个非 000 的三位数字 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/
正则表达式的 \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