ruby的正则表达式

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匹配到一个子字符串时,会把该子字符串放入到一个数组中,同时在原字符串中把匹配的子字符串删除掉。我们可以利用按顺序匹配多个匹配项的特性,只要排列好正则表达式中多个匹配项的顺序,可以事半功倍的达到目的。

你可能感兴趣的:(ruby的正则表达式)