当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《匹配所有出现的正则表达式》经验,为你挑选了3个好方法。

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



1> Jean..:

使用scan应该做的诀窍:

string.scan(/regex/)


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

2> sudo bangban..:

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

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

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

str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#, #, #, #, #, #, #]

拥有的好处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在红宝石将是超级有用.



3> MVP..:

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

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

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

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

要找到匹配的模式:

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

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有