2017-10-17 95 views
0

我试图匹配像“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:""> 

是否+不适用于|之后呢?

+0

为什么'这里.to_enum'?这看起来很奇怪。 – tadman

+0

我发现,当您想要将全局正则表达式应用于字符串时,可以获取所有MatchData对象。否则,它只会返回字符串匹配,而不会返回给出字符串起始位置的对象。 –

+0

如果你用'/ g'国旗做'match',你应该得到所有的匹配。 – tadman

回答

1

问题是(\s+|$)部件正在消耗后续匹配需要识别起始部件的空间。你基本上是通过吞噬所有这些空间来破坏你的下一轮,并将指针留在32.0开始的3位置。只要他们被认为是第一场比赛的一部分,他们将无法在第二场比赛中获得。

一个快速的解决方法是:

x.scan(/\s{2,}(-?\d{1,2}\.\d)/) 
# => [["23.0"], ["32.0"]] 
0

在这里做的最好的事情是使用正则表达式在线匹配器。我最喜欢的是RegExr

最佳我可以从你的描述讲的是要匹配simular到xx.y数字,在这种情况下

hrs_pnt_regex = /\d{2,}\.\d{1,2}/ 

将匹配两组,23.032.0