2017-01-11 22 views
0

我正在學習正則表達式。當我匹配此:正則表達式 - 爲什麼問號表現如此?

\d[^\w]\d 

這個

30-01-2003 15:20 

我得到3場比賽:0-0,1-2,3 5和5:2。 當我嘗試在正則表達式(\d[^\w]\d?)的末尾添加問號時,我的匹配不會改變。 當我將問號移到方括號(\d[^\w]?\d)後面時,匹配現在爲30,01,20,03,15和20. 當我將問號移到方括號(\d?[^\w]\d)之前時,我的匹配與第一種情況相同。

這是爲什麼?我知道?操作符將前面的字符標記爲可選的,所以我期望在第二種情況下的行爲,但不是在第一種或第三種情況下。

+0

如果您沒有意識到https://regex101.com會很好地解析和解釋正則表達式。 –

+0

謝謝。我會檢查出來 – shalvah

回答

2

因爲?是一個貪婪的匹配。它會嘗試儘可能多地消費。所以,如果\d存在,它會一直抓住它。

想想?最後定義了兩個正則表達式:\d[^\w]\d\d[^\w]。在你的測試案例中,你從來沒有匹配過第一個正則表達式不匹配,第二個正則表達式匹配(沒有重疊,又是貪婪)。這就是爲什麼你的比賽從不改變。但是,如果你改變了你的測試用例來此:

30-01-2003 15:20/ 

取決於你是否不包括在正則表達式結束的問號,您會得到0/額外的匹配。

+0

'*'還貪婪? – shalvah

+0

是的。爲了使所有格而不是貪婪,用'+'後綴它們。 '?+'或'* +'。 – nickb

0

ü只需要它

- 兩個解決方案 -

1 REGEXP:

\d+ 

1說明:

\d =>numbers 
+ => 1 or more 

2. REGEXP

[0-9]+ 

2.說明

[0-9] <= Numbers 
+ <= 1 or more 

它將匹配的所有數字(溶液1或2)

原始文本:

30-01-2003 15:20 

結果:

30 
01 
2003 
15 
20 

享受。

參見:https://regex101.com/r/xXaLgN/6

+0

雖然你做了(有點)解釋\ d +,但這不是問題所在。 – bartonjs

+0

我正在解釋如何捕捉數字,如果您符合否定條件,那麼當我試圖幫助知識時,就會去激活它。 –

1

由於您正在搜索的特定字符串,您的第一個和第三個案例與原始案例的結果相同 - 它們通常不是等同的搜索。特別是,在你的字符串中出現的每個\d[^\w]恰好後面跟着一個數字,所以使尾隨數字可選不會改變任何匹配。同樣,每個出現的[^\w]\d恰好都以數字開頭。如果您的字符串有兩個空格在一起,或者在某處添加了雙重標點符號,則結果會因每種情況而有所不同。

相關問題