参考手册:Ruby 语言样式——正则表达式
下面就来讲讲ruby支持的正则表达式符号(元字符)。
有这么个规则:
* 不带\的数字和字母不是元字符
* 带\的符号也不是元字符
下文中出现的“匹配多字节字符的正则表达式”是指,通过使用$KCODE进行设定,或显式地使用汉字选项(请参考正则表达式字面值)等方式进行的匹配多字节字符的正则表达式。
*
^
行首。与字符串的头部或换行符之后的位置相匹配。
*
$
行尾。与字符串的尾部或换行符之前的位置相匹配。不包括换行符本身。
ruby 1.8 特性:以前,只匹配字符串尾部换行符前的位置,现在则扩大到字符串的尾部。trap::Regexp
p "\n".gsub(/$/, "o")
=> "o\n" (1.6)
=> "o\no" (1.8)
*
.
匹配除换行符以外的任意一个字符。使用正则表达式选项 m(多行模式。请参考正则表达式字面值) 时,则匹配包括换行符在内的任意一个字符。在匹配多字节字符的正则表达式中,则匹配一个字(非单字节)。
当遇到不完整的多字节字符的一部分(无法判断该字符是多字节字符?二进制?还是ASCII)时,也不会匹配。
p /./e =~ "あ"[0,1] # => nil
*
\w
字母和数字。等同于[0-9A-Za-z]。
若为匹配多字节字符的正则表达式时,则也会匹配日语的全角字符。
*
\W
非字母和数字。\w以外的单个字符。
*
\s
空字符。相当于[ \t\n\r\f]
*
\S
非空字符。[ \t\n\r\f] 以外的单个字符。
*
\d
数字。即[0-9]
*
\D
非数字
*
\A
字符串头部。与^不同的是,它不受有无换行符的影响 。
*
\Z
字符串尾部。若字符串以换行符结尾,则匹配换行符前的位置。
ruby 1.8 特性:以前,只匹配字符串尾部换行符前的位置,现在则扩大到字符串的尾部。trap::Regexp
p "\n".gsub(/\Z/, "o")
=> "o\n" (1.6)
=> "o\no" (1.8)
*
\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次。尽可能匹配较长的部分。
*
*?
负责指定数量(quantifiers)。表示前面元素至少出现0次(尽量匹配短的部分)
*
+
负责指定数量(quantifiers)。表示前面元素至少出现1次
*
+?
负责指定数量(quantifiers)。表示前面元素至少出现1次(尽量匹配短的部分)
* {m}
* {m,}
*
{m,n}
指定元素重复出现的次数(interval quantifier)。分别表示前面元素重复出现
o m 次
o 至少 m 次
o 至少 m 次,至多 n 次
{,n} 或 {,} 将导致匹配失败。
str = "foofoofoo"
p str[/(foo){1}/] # => "foo"
p str[/(foo){2,}/] # => "foofoofoo"
p str[/(foo){1,2}/] # => "foofoo"
正则表达式 ?, *, + 分别等同于 {0,1}, {0,} {1,} 。
* {m}?
* {m,}?
*
{m,n}?
指定元素重复出现的次数(interval quantifier)。分别表示前面元素重复出现
o m 次
o 至少 m 次
o 至少 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 の婶尸の攫鼠はない)
*