测试字符串是否包含数组中的任何字符串

时间:2012-01-24 18:32:51

标签: java string coding-style if-statement

如何测试字符串以查看它是否包含数组中的任何字符串?

而不是使用

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

14 个答案:

答案 0 :(得分:144)

编辑:这是使用Java 8 Streaming API的更新。太干净了。仍然可以与正则表达式结合使用。

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()

如果您需要做比这更复杂的事情,我建议您查看PatternMatcher类,并学习如何做一些正则表达式。一旦理解了这些,就可以使用这些类或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;
}

答案 1 :(得分:48)

import org.apache.commons.lang.StringUtils;

String Utils

使用:

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

它将返回找到的字符串的索引,如果没有找到则返回-1。

答案 2 :(得分:28)

您可以使用String#matches这样的方法:

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

答案 3 :(得分:20)

最简单的方法可能是将数组转换为java.util.ArrayList。一旦它出现在arraylist中,您就可以轻松利用contains方法。

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

答案 4 :(得分:14)

如果你使用 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); 

答案 5 :(得分:6)

试试这个:

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

答案 6 :(得分: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;
}

答案 7 :(得分:1)

从版本3.4开始,Apache Common Lang 3实现了containsAny方法。

答案 8 :(得分:0)

更多groovyesque方法是将注入 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变量,请将该方法添加到类而不是对象:

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

答案 9 :(得分:0)

如果您正在寻找不区分大小写的匹配项,请使用模式

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

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

}

答案 10 :(得分:0)

如果您要搜索整个 单词,则可以做到这种效果,区分大小写 不敏感

private boolean containsKeyword(String line, String[] keywords)
{
    String[] inputWords = line.split(" ");

    for (String inputWord : inputWords)
    {
        for (String keyword : keywords)
        {
            if (inputWord.equalsIgnoreCase(keyword))
            {
                return true;
            }
        }
    }

    return false;
}

答案 11 :(得分:0)

我们也可以这样:

if (string.matches("^.*?((?i)item1|item2|item3).*$"))
(?i): used for case insensitive
.*? & .*$: used for checking whether it is present anywhere in between the string.

答案 12 :(得分:-1)

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

答案 13 :(得分:-2)

如果字符串是您要搜索的数组,则以下内容适用于您:

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

其中mykeytosearch是您要在数组中测试存在的字符串。 mysearchComparator - 是一个比较器,用于比较字符串。

有关详细信息,请参阅Arrays.binarySearch