2016-04-14 29 views
2

我有一個關於Java的匹配全字的問題,我想要做的就是找到每個單詞的開頭索引在給定線正則表達式整個單詞選項

Pattern pattern = Pattern.compile("("+str+")\\b"); 
Matcher matcher = pattern.matcher(line.toLowerCase(Locale.ENGLISH)); 
if(matcher.find()){ 
    //Doing something 
} 

我有這個給定的情況下的一個問題

line = "Watson has Watson's items."; 
str = "watson"; 

我想在這裏配合只有第一沃森不匹配,另一個,我不希望我的模式有一些空的空間控制,我應該在這種情況下

+0

你能澄清*我不希望我的模式有一些空的空間控制*請嗎?你對*字*及其允許*上下文*的要求是什麼?你知道,你可以追加一個像'(?!')'這樣的前視圖,在整個單詞之後不允許撇號。 –

+1

如果你想要第一個'watson'的開始索引,爲什麼不用'String#indexOf'函數呢? – SomeJavaGuy

+0

@WiktorStribiżew撇號只是一個例子。我要檢查 - ,+或其他任何非單詞字符 – user3430912

回答

1

的字邊界\b非單詞和單詞之間的字符的位置(或開始/結束之前/單詞字符之後)相匹配。 ',-,+等都是非字個字符,所以Watson\b將匹配Watson's(部分匹配)。

,如果它不與非空格符號中,您可能希望只匹配Watson

Pattern p = Pattern.compile("(?<!\\S)" + str + "(?!\\S)"); 

要在句末匹配Watson,你需要允許之前匹配.?!,使用

Pattern p = Pattern.compile("(?<!\\S)" + str + "(?![^\\s.!?])"); 

regex demo

僅供參考:也許,這是一個好主意,還使用Pattern.quote(str)而不是純str以免出現問題時,你str包含特殊的正則表達式元字符。

0

使用找到做()我的ThOD在匹配器

參見java docs

+0

我已經使用find方法 – user3430912

相關問題