检查字符串是否包含单词(不是子字符串!)

Check if string contains word (not substring!)

有没有办法检查子字符串是否包含整个 WORD,而不是子字符串。

设想以下场景:

public class Test {
    public static void main(String[] args) {
        String[] text = {"this is a", "banana"};
        String search = "a";

        int counter = 0;
        for(int i = 0; i < text.length; i++) {
            if(text[i].toLowerCase().contains(search)) {
                counter++;
            }
        }

        System.out.println("Counter was " + counter);
    }
}

计算结果为

Counter was 2

这不是我要查找的内容,因为数组中只有一个单词 'a' 的实例。

我的阅读方式是这样的:

if-test 在文本[0] 中找到一个'a','a' 对应于"this is [a]"。但是,它还会在 "banana" 中找到 'a' 的出现,从而增加计数器。

如何解决此问题以仅包含 WORD 'a',而不包含包含 a 的子字符串?

谢谢!

如果单词之间用 space 分隔,那么你可以这样做:

if((" "+text[i].toLowerCase()+" ").contains(" "+search+" "))
{
   ...
}

这会将两个 space 添加到原始字符串。
例如:"this is a" 变为 " this is a ".

然后它搜索带有侧翼 space 的单词。 例如:当 search"a"

时搜索 " a "

您可以使用正则表达式,使用 Pattern.quote 来转义任何特殊字符。

String regex = ".*\b" + Pattern.quote(search) + "\b.*"; // \b is a word boundary

int counter = 0;
for(int i = 0; i < text.length; i++) {
    if(text[i].toLowerCase().matches(regex)) {
        counter++;
    }
}

请注意,这还会在 "this is a; pause""Looking for an a?" 中找到 "a",其中 a 后面没有 space。

可以这样试试:

for(int i = 0; i < text.length; i++) {
    String[] words = text[i].split("\s+");
    for (String word : words) 
        if(word.equalsIgnoreCase(search)) {
            counter++;
            break;
        }
}
Arrays.asList("this is a banana".split(" ")).stream().filter((s) -> s.equals("a")).count();

当然,正如其他人所写,您可以开始使用各种模式来 匹配 "words" 出 "text"。

但问题是:根据您必须解决的潜在问题,这可能(到目前为止)还不够好。意思是:您是否面临在某个字符串中找到某种模式的问题……或者您真的想要在 "human language" 意义上解释该文本吗?你知道,当有人写下文字时,可能会有细微的错别字、奇怪的字符;各种各样的东西使得很难真正 "find" 该文本中的某个词。除非你深入研究事物的 "language processing" 方面。

长话短说:如果您的工作是 "locate certain patterns in strings";那么所有其他答案都可以。但是,如果您的要求超出此范围,例如 "some human will be using your application to 'search' huge data sets";那你最好现在停下来;并考虑转向启用全文搜索引擎,例如 ElasticSearch 或 Solr。