Java在字符串中匹配整个单词 [英] Java match whole word in String

查看:44
本文介绍了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在字符串中匹配整个单词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆