Проверьте, содержит ли строка какую-либо из строк из массива - PullRequest
124 голосов
/ 24 января 2012

Как проверить строку, чтобы увидеть, содержит ли она какие-либо строки из массива?

Вместо использования

if (string.contains(item1) || string.contains(item2) || string.contains(item3))

Ответы [ 12 ]

152 голосов
/ 25 января 2012

РЕДАКТИРОВАТЬ: Вот обновление с использованием потокового API Java 8. Так много чище. Можно комбинировать и с регулярными выражениями.

public static boolean stringContainsItemFromList(String inputStr, String[] items) {
    return Arrays.stream(items).parallel().anyMatch(inputStr::contains);
}

Кроме того, если мы изменим тип ввода на List вместо массива, мы можем использовать items.parallelStream().anyMatch(inputStr::contains).

Вы также можете использовать .filter(inputStr::contains).findAny(), если хотите вернуть соответствующую строку.


Оригинальный слегка датированный ответ:

Вот (ОЧЕНЬ ОСНОВНОЙ) статический метод. Обратите внимание, что в строках сравнения он чувствителен к регистру. примитив способ сделать его нечувствительным к регистру - это вызвать toLowerCase() или toUpperCase() как для входной, так и для тестовой строки.

Если вам нужно сделать что-то более сложное, чем это, я бы порекомендовал взглянуть на классы Pattern и Matcher и научиться делать некоторые регулярные выражения. Как только вы поймете это, вы можете использовать эти классы или вспомогательный метод String.matches().

public static boolean stringContainsItemFromList(String inputStr, String[] items)
{
    for(int i =0; i < items.length; i++)
    {
        if(inputStr.contains(items[i]))
        {
            return true;
        }
    }
    return false;
}
48 голосов
/ 28 мая 2015
import org.apache.commons.lang.StringUtils;

Строковые утилиты

Использование:

StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3})

Возвращает индекс найденной строки или -1, если ничего не найдено.

31 голосов
/ 24 января 2012

Вы можете использовать String # match метод, подобный этому:

System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));
19 голосов
/ 24 января 2012

Самый простой способ - это преобразовать массив в java.util.ArrayList. Как только он попадет в arraylist, вы можете легко использовать метод содержимого.

public static boolean bagOfWords(String str)
{
    String[] words = {"word1", "word2", "word3", "word4", "word5"};  
    return (Arrays.asList(words).contains(str));
}
15 голосов
/ 31 августа 2016

Если вы используете Java 8 или выше, вы можете положиться на Stream API для выполнения таких действий:

public static boolean containsItemFromArray(String inputString, String[] items) {
    // Convert the array of String items as a Stream
    // For each element of the Stream call inputString.contains(element)
    // If you have any match returns true, false otherwise
    return Arrays.stream(items).anyMatch(inputString::contains);
}

Предполагая, что у вас есть большой массив больших String для тестирования, вы также можете запустить поиск параллельно, вызвав parallel(), тогда код будет:

return Arrays.stream(items).parallel().anyMatch(inputString::contains); 
4 голосов
/ 24 января 2012

Попробуйте это:

if (Arrays.asList(item1, item2, item3).contains(string))
2 голосов
/ 06 января 2016

Вот одно из решений:

public static boolean containsAny(String str, String[] words)
{
   boolean bResult=false; // will be set, if any of the words are found
   //String[] words = {"word1", "word2", "word3", "word4", "word5"};

   List<String> list = Arrays.asList(words);
   for (String word: list ) {
       boolean bFound = str.contains(word);
       if (bFound) {bResult=bFound; break;}
   }
   return bResult;
}
1 голос
/ 23 мая 2018

Начиная с версии 3.4 в Apache Common Lang 3 реализован метод containsAny .

0 голосов
/ 03 февраля 2017

А если вы ищете регистр без учета регистра, используйте шаблон

Pattern pattern = Pattern.compile("\\bitem1 |item2\\b",java.util.regex.Pattern.CASE_INSENSITIVE);

    Matcher matcher = pattern.matcher(input);
    if(matcher.find() ){ 

}
0 голосов
/ 18 ноября 2013

Более подходящим подходом будет использование inject в сочетании с metaClass :

Я бы с удовольствием сказал:

String myInput="This string is FORBIDDEN"
myInput.containsAny(["FORBIDDEN","NOT_ALLOWED"]) //=>true

И метод будет:

myInput.metaClass.containsAny={List<String> notAllowedTerms->
   notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}

Если вам нужно, чтобы containsAny присутствовало для любой будущей строковой переменной, добавьте метод к классу вместо объекта:

String.metaClass.containsAny={notAllowedTerms->
   notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...