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

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

而不是利用

if (string.contains(item1) || string.contains(item2) || string.contains(item3))
335132 次浏览

最简单的方法可能是将数组转换为 java.util。数组列表。一旦它在数组列表中,您就可以轻松地利用包含方法。

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

试试这个:

if (Arrays.stream(new String[] {item1, item2, item3}).anyMatch(inputStr::contains))
if (Arrays.asList(array).contains(string))

你可以这样使用 字符串 # 匹配方法:

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

假设 绳子是您正在搜索的数组,下面的代码应该对您有用:

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

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

有关详细信息,请参阅 二进制搜索

编辑: 这里是一个使用 Java8流 API 的更新。干净多了。也可以与正则表达式组合。

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

另外,如果我们将输入类型改为 List 而不是数组,我们可以使用 items.stream().anyMatch(inputStr::contains)

如果希望返回匹配的字符串,也可以使用 .filter(inputStr::contains).findAny()

重要提示: 以上代码可以使用 parallelStream()完成,但大多数情况下这实际上会阻碍性能。见 更多关于并行流的细节


原始的略带日期的回答:

下面是一个(非常基本的)静态方法。注意,它对比较字符串区分大小写。使其不区分大小写的 原始方法是对输入字符串和测试字符串调用 toLowerCase()toUpperCase()

如果您需要执行比这更复杂的操作,我建议您查看 模式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;
}

一种更为常规的方法是将 注射元类结合使用:

我想说:

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

如果您需要为将来的任何 String 变量提供 包含任何,那么将该方法添加到类中,而不是添加对象:

String.metaClass.containsAny={notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
import org.apache.commons.lang.StringUtils;

字符串工具

用途:

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

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

这里有一个解决办法:

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或以上,你可以依靠 数据流 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);

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

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


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

从版本3.4开始,Apache Common Lang 3实现了 包含任何方法。

如果你正在寻找 完整 文字,你可以这样做,工程 案件 麻木不仁

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

我们也可以这样做:

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

在 Kotlin

if (arrayOf("one", "two", "three").find { "onetw".contains(it) } != null){
doStuff()
}