Java在字符串中匹配整个单词

2022-06-27 00:00:00 string regex match 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

相关文章