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

时间:2016-04-22 12:05:07

标签: java substring word

有没有办法检查子字符串是否包含整个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

这不是我想要的,因为只有一个单词&#39; a&#39;在数组中。

我读它的方式如下:

if-test发现了一个&#39; a&#39;在文字[0]中,&#39; a&#39;对应于&#34;这是[a]&#34;。但是,它也发现了&#39; a&#39;在&#34; banana&#34;中,从而递增计数器。

如何解决这个问题只包含WORD&#39; a&#39;,而不是包含?

的子字符串?

谢谢!

5 个答案:

答案 0 :(得分:5)

您可以使用正则表达式,使用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++;
    }
}

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

答案 1 :(得分:1)

可以这样试试:

for(int i = 0; i < text.length; i++) {
    String[] words = text[i].split("\\s+");
    for (String word : words) 
        if(word.equalsIgnoreCase(search)) {
            counter++;
            break;
        }
}

答案 2 :(得分:0)

Arrays.asList("this is a banana".split(" ")).stream().filter((s) -> s.equals("a")).count();

答案 3 :(得分:0)

当然,正如其他人所写,您可以开始使用各种模式来“强化”匹配“单词”中的“文字”。

但问题是:根据您必须解决的潜在问题,这可能(到目前为止)还不够好。含义:你是否面临在某些字符串中找到某种模式的问题......或者它是否真的,你想要用“人类语言”的意义来解释那些文本?你知道,当有人写下文字时,可能会有一些微妙的错别字,奇怪的字符;各种各样的东西,使得很难真正“找到”该文本中的某个单词。除非你深入研究事物的“语言处理”方面。

长话短说:如果你的工作是“在字符串中找到某些模式”;然后所有其他答案都会做。但是,如果你的要求超出了这个要求,就像“有些人将使用你的应用程序'搜索'庞大的数据集”;那么你现在最好停下来;并考虑转向支持全文的搜索引擎,如ElasticSearch或Solr。

答案 4 :(得分:-1)

如果单词用空格分隔,那么你可以这样做:

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

这会在原始String中添加两个空格 例如:"this is a"变为" this is a "

然后它用侧翼空格搜索单词。 例如:当" a "search

时,它会搜索"a"