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

Chr*_*nch 571 ruby regex

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

Jea*_*ean 804

使用scan应该做的诀窍:

string.scan(/regex/)
Run Code Online (Sandbox Code Playgroud)

  • 这看起来像是一个Ruby WTF ...为什么这是在String而不是Regexp与其他regexp的东西?在Regexp的文档中甚至没有提到它 (48认同)
  • 不是不会./.../是一个正常的贪婪正则表达式.它不会回溯匹配的内容.你可以尝试使用懒惰的正则表达式,但即使这可能还不够.看一下regexp doc http://www.ruby-doc.org/core-1.9.3/Regexp.html来正确表达你的正则表达式:) (13认同)
  • 但是这种情况如何呢?"匹配我!".scan(/.../)= ["mat","ch""我!" ],但所有出现的/.../都是["mat","atc","tch","ch",......] (9认同)
  • 我想这是因为它的定义和调用String而不是Regex ......但它确实有意义.您可以编写正则表达式以使用Regex #matra捕获所有匹配并迭代捕获的组.在这里你编写一个部分匹配函数,并希望它在给定的字符串上应用多次,这不是Regexp的责任.我建议你检查一下扫描的实现,以便更好地理解:http://ruby-doc.org/core-1.9.3/String.html#method-i-scan (8认同)
  • @MichaelDickens:在这种情况下,你可以使用`/(?=(...))/`. (7认同)
  • 谢谢@xfix,进入一个平面阵列`/(?=(....))/.flatten` (2认同)
  • @DelongGao它让正则表达式引擎认为匹配结束位置是起始位置.通常,匹配不能重叠,并且为了避免这个问题,正则表达式引擎从上一个匹配的结束位置开始搜索. (2认同)

sud*_*ang 64

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

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

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

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

拥有的好处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]
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多信息,请参阅这些问题
如何获取字符串中出现的所有Ruby正则表达式的匹配数据?
具有命名捕获支持的Ruby正则表达式匹配枚举器
如何找出ruby中每个匹配的起点

阅读有关特殊变量$&,$',$1,$2在红宝石将是超级有用.


MVP*_*MVP 12

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

str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/
Run Code Online (Sandbox Code Playgroud)

您可以使用scan of string方法查找匹配的组:

str.scan re
#> [["54"], ["1"], ["3"]]
Run Code Online (Sandbox Code Playgroud)

要找到匹配的模式:

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


Dat*_*att 8

您可以使用string.scan(your_regex).flatten。如果您的正则表达式包含组,它将以单个普通数组返回。

string = "A 54mpl3 string w1th 7 numbers scatter3r ar0und"
your_regex = /(\d+)[m-t]/
string.scan(your_regex).flatten
=> ["54", "1", "3"]
Run Code Online (Sandbox Code Playgroud)

正则表达式也可以是命名组。

string = 'group_photo.jpg'
regex = /\A(?<name>.*)\.(?<ext>.*)\z/
string.scan(regex).flatten
Run Code Online (Sandbox Code Playgroud)

您也可以使用gsub,如果您想要 MatchData,这只是另一种方式。

str.gsub(/\d/).map{ Regexp.last_match }
Run Code Online (Sandbox Code Playgroud)