2012-01-24 2 views
84

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

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

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

Вы спрашиваете, является ли строка ** ** равна любой из строк в массиве, или ** содержит ** любая строка из массива? – Natix

+1

Вы хотите проверить, не является ли какая-либо строка из массива подстрокой вашей строки ввода? Или вы хотите проверить, соответствует ли ваша строка ввода * одной из строк в массиве? Вы можете уточнить? –

+1

содержит, так что он берет строку и видит, содержит ли она какие-либо слова из списка (хранится как массив строк) – user1060828

ответ

93

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(), если хотите вернуть соответствующую строку.


Оригинал немного от ответа:

Вот (очень простой) статический метод. Обратите внимание, что он чувствителен к регистру в строках сравнения. A примитив способ сделать регистр нечувствительным к регистру состоял бы в вызове 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; 
} 
17

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

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

Это неверно. OP спрашивает, содержит ли 'string'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' если '' '' '' '' '' '' '' '' '' '' '' ''. –

+3

@BeauGrantham Я тоже думал об этом, но OP использует '.equals()' в своем сообщении, что очень сбивает с толку. Я считаю, что им нужно отредактировать их вопрос. – gnomed

+0

@BeauGrantham Man. Я не мог поклясться. Я понял проблему. Может быть, вопрос нужно уточнить еще немного? –

7

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

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

Вопрос противоположный: содержит ли целевая строка какие-либо строки списка. –

+0

Вопрос противоположный – sgrillon

1
if (Arrays.asList(array).contains(string)) 
+8

Вопрос противоположный: содержит ли целевая строка какие-либо строки списка. –

+2

Вопрос противоположный – sgrillon

27

Вы можете использовать String#matches метод, как это:

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

Ниже следует работать для вас, если предположить строк является массив, который вы находятся в пределах:

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

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

Для получения дополнительной информации см. Arrays.binarySearch.

+2

Следует отметить, что binarySearch работает только в массиве, который сортируется, естественно или по заданному компаратору (если таковой задан). – Natix

0

Более groovyesque подход будет использовать впрыснуть в сочетании с метакласса:

Я бы любить сказать:

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)}) 
} 
40
import org.apache.commons.lang.StringUtils; 

String Utils

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

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

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

+4

JFI: Я надеялся, что эта реализация будет повторяться только один раз над inputString, но я посмотрел на код в StringUtils, и, к сожалению, он просто делает N вызовов по умолчанию indexOf. – alfonx

+0

Возможно, на commons3 реализация лучше! – renanlf

+0

Нет, все еще просто выполняет итерации по строкам в org.apache.commons.lang3.StringUtils: для (int i = 0; i alfonx

2

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

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

Это даже не код Java. – Hamdi

7

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

Одна странная вещь, которую я заметил, у меня есть два элемента в списке строк, я узнал, когда я использую «parallel», он не вернет правильные результаты. (даже если он содержит значение). –

+0

@ Charles.C это странно, я не могу воспроизвести на моей стороне. –

0

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

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

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

} 
Смежные вопросы