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

烈酒焚心 提交于 2020-01-07 17:22:03

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

有没有一种快速的方法来查找Ruby中正则表达式的每个匹配项? 我浏览了Ruby STL中的Regex对象,并在Google上搜索都没有用。


#1楼

为了找到所有匹配的字符串,请使用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正则表达式匹配枚举器
如何找出红宝石中每场比赛的起点

阅读红宝石中的特殊变量$&$'$1$2会很有帮助。


#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"]

#3楼

使用scan应该可以解决问题:

string.scan(/regex/)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!