匹配正则表达式的所有出现次数

有没有一种快速的方法来找到Ruby中的正则表达式的每一个匹配? 我查看了Ruby STL中的Regex对象,并在Google上搜索无济于事。


使用scan应该做的诀窍是:

string.scan(/regex/)

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

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

如果您希望MatchData是由Regexp类的match方法返回的对象的类型,请使用以下内容

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这样的方法

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中的特殊变量$&$'$1$2将会非常有帮助。


如果你有一个组的正则表达式:

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

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

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

要找到匹配的模式:

str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]
链接地址: http://www.djcxy.com/p/13403.html

上一篇: Match All Occurrences of a Regex

下一篇: passing variable to a regexp in javascript