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
相关文章