正则表达式或与通配符不匹配
问题描述:
我试图匹配像“23.0 32.0”的字符串。这里是我的正则表达式:正则表达式或与通配符不匹配
hrs_pnt_regex = /\s{2,}-?\d{1,2}\.\d(\s+|$)/
代码:
x = " 23.0 32.0"
x.to_enum(:scan, hrs_pnt_regex).map { Regexp.last_match }
结果:
MatchData " 23.0 " 1:" "
我注意到的是,\ S +似乎并没有在年底括号工作。如果我将它更改为“\ s \ s”,它会像这样匹配两个数字。否则,我只得到第一个。
<MatchData " 23.0 " 1:" ">, <MatchData " 32.0" 1:"">
是否+不适用于|之后呢?
答
问题是(\s+|$)
部件正在消耗后续匹配需要识别起始部件的空间。你基本上是通过吞噬所有这些空间来破坏你的下一轮,并将指针留在32.0
开始的3
位置。只要他们被认为是第一场比赛的一部分,他们将无法在第二场比赛中获得。
一个快速的解决方法是:
x.scan(/\s{2,}(-?\d{1,2}\.\d)/)
# => [["23.0"], ["32.0"]]
答
在这里做的最好的事情是使用正则表达式在线匹配器。我最喜欢的是RegExr。
最佳我可以从你的描述讲的是要匹配simular到xx.y
数字,在这种情况下
hrs_pnt_regex = /\d{2,}\.\d{1,2}/
将匹配两组,23.0
和32.0
为什么'这里.to_enum'?这看起来很奇怪。 – tadman
我发现,当您想要将全局正则表达式应用于字符串时,可以获取所有MatchData对象。否则,它只会返回字符串匹配,而不会返回给出字符串起始位置的对象。 –
如果你用'/ g'国旗做'match',你应该得到所有的匹配。 – tadman