本文介紹了Java在字符串中匹配整個(gè)單詞的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我有一個(gè)ArrayList<String>
,我遍歷它以查找給定字符串的正確索引。基本上,在給定一個(gè)字符串的情況下,程序應(yīng)該搜索整個(gè)列表并找到與整個(gè)單詞匹配的索引。例如:
ArrayList<String> foo = new ArrayList<String>();
foo.add("AAAB_11232016.txt");
foo.add("BBB_12252016.txt");
foo.add("AAA_09212017.txt");
因此,如果我給出字符串AAA
,我應(yīng)該會(huì)得到索引2
(最后一個(gè))。因此,我不能使用contains()
方法,因?yàn)槟菢訒?huì)返回索引0
。
我嘗試使用此代碼:
String str = "AAA";
String pattern = "\b" + str + "\b";
Pattern p = Pattern.compile(pattern);
for(int i = 0; i < foo.size(); i++) {
// Check each entry of list to find the correct value
Matcher match = p.matcher(foo.get(i));
if(match.find() == true) {
return i;
}
}
不幸的是,此代碼從未到達(dá)循環(huán)內(nèi)的if
語(yǔ)句。我不確定我做錯(cuò)了什么。
注意:如果我搜索AAA_0921
、全名AAA_09212017.txt
或字符串中唯一的任何部分,也應(yīng)該這樣做。
推薦答案
由于單詞字符和下劃線之間的單詞邊界不匹配,您需要
String pattern = "(?<=_|\b)" + str + "(?=_|\b)";
在這里,(?<=_|)
正向后視需要在str
之前出現(xiàn)單詞邊界或下劃線,而(?=_|)
正向前視需要在str
之后出現(xiàn)下劃線或單詞邊界。
參見(jiàn)this regex demo。
如果您的單詞中可能包含特殊字符,您可能需要使用更直接的單詞邊界:
"(?<![^\W_])" + Pattern.quote(str) + "(?![^\W_])"
這里,如果存在除下劃線以外的單詞字符,則負(fù)向查找(?<![^\W_])
匹配失敗([^...]
是與該類中定義的字符、范圍等之外的任何字符匹配的否定字符類,因此,它匹配除非單詞字符W
和_
以外的所有字符),如果(?![^W_])
存在單詞字符,則(?![^W_])
負(fù)向查找匹配失敗。
請(qǐng)注意,第二個(gè)示例有一個(gè)帶引號(hào)的搜索字符串,因此即使AA.A_str.txt
也可以與AA.A
很好地匹配。
參見(jiàn)another regex demo
這篇關(guān)于Java在字符串中匹配整個(gè)單詞的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,