Проверьте, содержит ли строка ни одну из строк из массива

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

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

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

Ответ 1

EDIT: это обновление с использованием Java 8 Streaming API. Так много чище. Также можно комбинировать с регулярными выражениями.

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

Кроме того, если мы изменим тип ввода на список вместо массива, мы можем использовать 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;
}

Ответ 2

import org.apache.commons.lang.StringUtils;

String Utils

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

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

Он вернет индекс найденной строки или -1, если ни один не найден.

Ответ 3

Вы можете использовать метод String # следующим образом:

System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));

Ответ 4

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

public static boolean bagOfWords(String str)
{
    String[] words = {"word1", "word2", "word3", "word4", "word5"};  
    return (Arrays.asList(words).contains(str));
}

Ответ 5

Попробуйте следующее:

if (Arrays.asList(item1, item2, item3).contains(string))

Ответ 6

Если вы используете 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); 

Ответ 7

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

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

Ответ 8

if (Arrays.asList(array).contains(string))

Ответ 9

Более серьезный подход заключался бы в использовании вставки в комбинации с 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)})
}

Ответ 10

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

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

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

}

Ответ 11

String.prototype.matchWithTokens = function(tokensArray){
  for(i=0; i< tokensArray.length; i++) {
    if(this.indexOf(tokensArray[i]) != -1) {
      return true;
    }
  }
    return false;
};

Ответ 12

Ниже следует работать для вас, предполагая, что Строки - это массив, который вы ищете внутри:

Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator);

где mykeytosearch - это строка, которую вы хотите проверить для существования внутри массива. mysearchComparator - это компаратор, который будет использоваться для сравнения строк.

Подробнее см. Arrays.binarySearch.