2017-10-17 79 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