Check if string contains word (not substring!)

Refresh

December 2018

Views

1.4k time

2

Is there a way to check if a substring contains an entire WORD, and not a substring.

Envision the following scenario:

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);
    }
}

This evaluates to

Counter was 2

Which is not what I'm looking for, as there is only one instance of the word 'a' in the array.

The way I read it is as follows:

The if-test finds an 'a' in text[0], the 'a' corresponding to "this is [a]". However, it also finds occurrences of 'a' in "banana", and thus increments the counter.

How can I solve this to only include the WORD 'a', and not substrings containing a?

Thanks!

5 answers

0

Конечно, как и другие написали, вы можете начать играть вокруг со всеми видами рисунка , чтобы соответствовать «слова» из «текста».

Но главное: в зависимости от основной проблемы, которую вы должны решить, это может (на сегодняшний день) не достаточно хорошо. Значение: вы столкнулись с проблемой найти какой-то шаблон в некоторой строке ... или это на самом деле, что вы хотите, чтобы интерпретировать этот текст в «человеческом языке» смысл? Вы знаете, когда кто-то записывает текст, может быть тонкие опечатки, странные символы; все виды вещей, которые делают его действительно трудно «найти» определенное слово в этом тексте. Если вы не нырять в «обработке языка» аспект вещей.

Короче говоря: если ваша работа «найти определенные закономерности в строках»; то все остальные ответы будут делать. Но если ваше требование выходит за рамки того, как «некоторые человеческие будут использовать приложение для„поиска“огромные наборы данных»; то вам лучше остановиться сейчас; и рассмотреть обращение к полнотекстовым включена поисковым системам, как ElasticSearch или Solr.

0
Arrays.asList("this is a banana".split(" ")).stream().filter((s) -> s.equals("a")).count();
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

Может попробовать так:

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

Если слова разделены пробелом, то вы можете сделать:

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

Это добавляет два пробела к исходной строке.
например: "this is a"становится " this is a ".

Затем он ищет слова, с фланговыми пространствами. например: Он ищет , " a "когда searchэто"a"