关于ruby:匹配所有出现的正则表达式

Match all occurrences of a regex

有没有一种快速的方法可以找到Ruby中正则表达式的每一个匹配项?我查看了ruby stl中的regex对象,并在Google上搜索到了无效的结果。


使用scan应该可以做到:

1
string.scan(/regex/)


要查找所有匹配的字符串,请使用String类的scan方法。

1
2
3
str ="A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54","3","1","7","3","36","0"]

如果您希望MatchDataRegexp类的match方法返回的对象类型,请使用以下方法

1
2
str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData"54">, #<MatchData"3">, #<MatchData"1">, #<MatchData"7">, #<MatchData"3">, #<MatchData"36">, #<MatchData"0">]

拥有MatchData的好处是,您可以使用像offset这样的方法。

1
2
3
4
5
match_datas = str.to_enum(:scan, /\d+/).map { Regexp.last_match }
match_datas[0].offset(0)
#=> [2, 4]
match_datas[1].offset(0)
#=> [7, 8]

如果你想了解更多,也可以参考这些问题。如何获取字符串中所有出现的Ruby正则表达式的匹配数据?与支持命名捕获的枚举器匹配的Ruby正则表达式如何找出Ruby中每个匹配的起点

阅读Ruby中的特殊变量$&$'$1$2将非常有帮助。


如果有带组的regexp:

1
2
str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/

使用字符串扫描方法查找匹配的组:

1
2
str.scan re
#> [["54"], ["1"], ["3"]]

要查找匹配的图案:

1
2
str.to_enum(:scan,re).map {$&}
#> ["54m","1t","3r"]