2011-06-14 87 views
1

我希望:\b([a-zA-Z]+\.?)\b or \b([a-zA-Z]+\.{0,1})\b至少可以作爲一個字母和最多一個點。正則表達式在JAVA中最多隻有一個點

但匹配器發現「ab」的輸入是「ab」「ab」。和「AB ..」,我期待它做到以下幾點:

"ab" is found for input "ab" 
"ab." is found for input "ab." 
nothing is found for input "ab.." 

如果我更換正則表達式與0工作,而不是一個點如\b([a-zA-Z]+0?)\b比它按預期工作:

"ab" is found for input "ab" 
"ab0" is found for input "ab0" 
nothing is found for input "ab00" 

那麼,如何讓我的正則表達式來工作嗎?

+0

問題是什麼? – talnicolas 2011-06-14 15:15:11

+0

我明白了,我的壞 – talnicolas 2011-06-14 15:16:13

+1

一個點也是一個字的邊界。你允許它被發現兩次。 – pritaeas 2011-06-14 15:17:20

回答

5

的問題是,\b單詞字符之間的匹配和非單詞字符,而不是在空格和非空格之間,因爲您似乎在嘗試。 .0之間的區別在於0被認爲是「單詞」字符,但.不是。

那麼是什麼發生在你的例子是這樣的:

讓我們看最後一個字符串ab..,看看\b可以匹配:

a b . . 
^x^x x 

記住,\b字符之間的匹配。我已經顯示\b可以與^匹配,並且不能與x匹配。由於\b只能在a前面匹配,或者在b之後匹配,所以只要匹配ab,只要您有那些\b位。

我想你想要的東西像\bab\.?(?!\S)。那說「單詞邊界,然後a然後b然後可能是一個單一的點,其中沒有非空間字符後。」

如果我誤解了你的問題,你想表達找到ab.字符串ab.c或找到abcab你可以做\bab\.?(?!\.)

0
  • \b([a-zA-Z]+\.+)\b是「隨後在至少一個點
  • \b([a-zA-Z]+\.{0,1})\b是至少有一個字母」至少有一個字母后跟零個或一個點
+0

我複製了代碼\ b([a-zA-Z] + \?)\ b時犯了一個錯誤我修復了這個問題 – ddayan 2011-06-14 15:24:12