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

aro*_*ell 135 java string if-statement coding-style

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

而不是使用

if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Run Code Online (Sandbox Code Playgroud)

gno*_*med 160

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

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

此外,如果我们将输入类型更改为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;
}
Run Code Online (Sandbox Code Playgroud)


ren*_*rof 49

import org.apache.commons.lang.StringUtils;
Run Code Online (Sandbox Code Playgroud)

String Utils

使用:

StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3})
Run Code Online (Sandbox Code Playgroud)

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

  • JFI:我希望这个实现只在inputString上迭代一次,但是我查看了StringUtils中的代码,遗憾的是它只是进行了默认indexOf的N次调用. (7认同)
  • 不,仍然只是遍历 org.apache.commons.lang3.StringUtils 中的字符串: for (int i = 0; i &lt; searchStrs.length; i++) { CharSequenceUtils.indexOf(str, search, 0); .... (3认同)

anu*_*ava 31

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

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


Roy*_*ouh 16

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

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

  • 这是不正确的.OP询问`string`是否包含数组中的任何`String`s,而不是数组中的任何`String`s是否包含`string`. (65认同)
  • @BeauGrantham我也在想这个,但OP在他们的帖子中使用了`.equals()`,这非常令人困惑.我估计他们需要编辑他们的问题 (3认同)
  • 问题恰恰相反 (2认同)

Nic*_*tto 15

如果您使用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);
}
Run Code Online (Sandbox Code Playgroud)

假设您有大量的大型String测试,您也可以通过调用并行启动搜索parallel(),那么代码将是:

return Arrays.stream(items).parallel().anyMatch(inputString::contains); 
Run Code Online (Sandbox Code Playgroud)