http://www.w3cschool.cc/ruby/ruby-regular-expressions.html
要对一个字符串进行全部匹配,比如“bbbb"
匹配/bbb/
,结果应该返回2次匹配。
而当用"bbbb".scan(/bbb/)
时,只能匹配到1次。
因为在匹配了第一个bbb
后,"bbbb"
就会把bbb
从字符串去去除,这样,剩下的只有”b"
了,所以就不能继续匹配/bbb/
了.
那么,应该怎么去匹配呢?最开始我是这样写的:
for i in 0.."bbbb".size-1
"bbbb"[i,"bbb".size] == "bbb"
end
这样肯定不行。不太符合ruby的精神,所以找了一下,还真有解决方案,如下 :
"bbbb".scan(/(?=bbb)/)
,这样能匹配到2次。但是返回的是["",""]
而"bbbb".scan(/bbb/)
返回的是["bbb"]
.
那么/(?=bbb)/
表示什么呢?
我个人理解是:当找到第一个匹配字符串的位置时,认为这个位置后面也会有匹配的字符串,这样的话,就有点类似于最开始写的for循环了。。
ruby一直被认为是处理字符串的神器,如能利用正则表达式和字符串的方法,代码会变得优雅简洁。参考这个帖子即可,写的非常详细。
http://blog.csdn.net/menxu_work/article/details/9134447
在这里要特意说明一下scan方法有以下的代码:
TESTSTR = "IIVIIIVIVVIIV"
regexp1 = Regexp.new('IVI|VI|IV|III|V')
regexp2 = Regexp.new('IV|VI|IVI|III|V')
p a = TESTSTR.scan(regexp1) #=>["IVI", "IVI", "V", "VI", "IV"]
p b = TESTSTR.scan(regexp2) #=>["IV", "III", "VI", "V", "VI", "IV"]
可以看到,当正则表达式中有多个可以匹配的项时,仅仅是变换了第1和第3个位置,匹配出来的结果是不一样的。所以scan的匹配是按匹配项的顺序来进行的。当scan匹配到一个子字符串时,会把该子字符串放入到一个数组中,同时在原字符串中把匹配的子字符串删除掉。我们可以利用按顺序匹配多个匹配项的特性,只要排列好正则表达式中多个匹配项的顺序,可以事半功倍的达到目的。