2012-11-11 28 views
5

我想這個字符串匹配: s +不匹配所有空格?

文本18 19文本

有了這個表達式:

\s+\d\d\s+ 

字符串有兩個數字,他們每個人都被包圍領先和尾隨空間。

所以我在想 - 這應該給我18和19吧? 它沒有,它只是給了我只有18

我這個測試儀測試在這裏:http://java-regex-tester.appspot.com/

謝謝!

回答

8

不要第二項匹配的原因是,第一場比賽的後\s+的空間和19之間18是消耗。你應該使非消耗零寬度的regexp爲結尾的空白,例如,通過使用先行語法或令牌用於零寬度邊界:

\s+\d\d(?=\s+) 
+0

很好的解釋+1的帖子。 –

5

使用這個代替:

\b\d\d\b 

你的正則表達式是不匹配的第二個數字,因爲第一場比賽已經「吃掉」所有的空間。

同時,\b是一個「字邊界」,即所謂的零寬度(元)字符:它在匹配時不會「吃東西」。

+0

真棒。我很好奇,爲什麼\ b不會吃掉空間,而\ s呢? – David

+0

@David - 請參閱編輯。它是被設計爲零寬度的幾個正則表達式之一。另一個值得注意的是前瞻,你也可以使用它:'\ s + \ d \ d(?= \ s)'。 –

+0

請注意,如果有任何 – Anirudha

3

因爲第一次解析輸出爲「18」,剩餘字符串爲「19文本」,這不匹配。