本文介紹了Java在字符串中匹配整個單詞的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個ArrayList<String>
,我遍歷它以查找給定字符串的正確索引?;旧?,在給定一個字符串的情況下,程序應該搜索整個列表并找到與整個單詞匹配的索引。例如:
ArrayList<String> foo = new ArrayList<String>();
foo.add("AAAB_11232016.txt");
foo.add("BBB_12252016.txt");
foo.add("AAA_09212017.txt");
因此,如果我給出字符串AAA
,我應該會得到索引2
(最后一個)。因此,我不能使用contains()
方法,因為那樣會返回索引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;
}
}
不幸的是,此代碼從未到達循環內的if
語句。我不確定我做錯了什么。
注意:如果我搜索AAA_0921
、全名AAA_09212017.txt
或字符串中唯一的任何部分,也應該這樣做。
推薦答案
由于單詞字符和下劃線之間的單詞邊界不匹配,您需要
String pattern = "(?<=_|\b)" + str + "(?=_|\b)";
在這里,(?<=_|)
正向后視需要在str
之前出現單詞邊界或下劃線,而(?=_|)
正向前視需要在str
之后出現下劃線或單詞邊界。
參見this regex demo。
如果您的單詞中可能包含特殊字符,您可能需要使用更直接的單詞邊界:
"(?<![^\W_])" + Pattern.quote(str) + "(?![^\W_])"
這里,如果存在除下劃線以外的單詞字符,則負向查找(?<![^\W_])
匹配失敗([^...]
是與該類中定義的字符、范圍等之外的任何字符匹配的否定字符類,因此,它匹配除非單詞字符W
和_
以外的所有字符),如果(?![^W_])
存在單詞字符,則(?![^W_])
負向查找匹配失敗。
請注意,第二個示例有一個帶引號的搜索字符串,因此即使AA.A_str.txt
也可以與AA.A
很好地匹配。
參見another regex demo
這篇關于Java在字符串中匹配整個單詞的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,