有在 Ruby 中查找正则表达式的所有匹配项的快速方法吗?我已经通过 Ruby STL 中的正则表达式对象看起来,在 Google 上搜索徒劳无功。

2008-09-17 05:46:26
问题评论:

回答:

使用scan应做到︰

string.scan(/regex/)

但是什么靠紧在一起这种情况呢?"匹配我 !"。scan(/.../) = ["垫"、"ch""我 !"],["垫""atc"、"匹配"、"ch",...] 是的 /.../ 所有匹配项,但

不它不是。/.../ 是正常的贪婪 regexp。它不会匹配内容进行回溯。您可以尝试使用惰性 regexp 但仍可能就不是足够的。regexp doc ruby-doc.org/core-1.9.3/Regexp.html :) 正确表达您 regexp 一下

这看起来像 Ruby WTF...为什么它是字符串而不是 Regexp 上了其他 regexp 东西吗?它不是甚至提到任何位置上的 Regexp 的文档

我猜这是因为它有定义,对不在正则表达式的字符串调用...但是,它实际上可使意义。您可以编写正则表达式捕获使用 Regex #match 的所有匹配项并循环访问捕获的组。这里编写部分匹配函数并且希望 it 应用多个在时间上给定的字符串,这不是责任的 Regexp。我建议您检查更好地了解扫描的实现︰ ruby-doc.org/core-1.9.3/String.html#method-i-scan

@MichaelDickens︰ 在这种情况下,您可以使用/(?=(...))/.

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

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

如果您而是希望MatchData的对象的类型,match方法返回的Regexp classs,使用下面的

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在 ruby 中能进一步有所帮助。

如果您具有 regexp 组︰

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

您可以使用字符串方法进行扫描以查找匹配的组︰

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

若要查找匹配模式︰

str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]
内容来源于Stack Overflow Match All Occurrences of a Regex
请输入您的翻译

Match All Occurrences of a Regex

确认取消