如何测试字符串以查看其是否包含数组中的任何字符串?
而不是使用
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
如何测试字符串以查看其是否包含数组中的任何字符串?
而不是使用
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Answers:
编辑:这是使用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()
如果希望返回匹配的字符串,也可以使用。
原始的过时的答案:
这是(VERY BASIC)静态方法。请注意,在比较字符串上区分大小写。使它不区分大小写的一种原始方法是在输入和测试字符串上调用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;
}
import org.apache.commons.lang.StringUtils;
用:
StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3})
它将返回找到的字符串的索引;如果找不到,则返回-1。
您可以像这样使用String#matches方法:
System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));
最简单的方法可能是将数组转换为java.util.ArrayList。将其放入数组列表后,即可轻松利用contains方法。
public static boolean bagOfWords(String str)
{
String[] words = {"word1", "word2", "word3", "word4", "word5"};
return (Arrays.asList(words).contains(str));
}
string
包含任何String
,而不是String
数组中是否包含string
。
.equals()
在他们的帖子中使用了,这非常令人困惑。我认为他们需要编辑他们的问题
如果您使用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);
这是一种解决方案:
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;
}
一种更古怪的方法是将注入与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)})
}
如果将来任何String变量都需要包含containsAny,则将方法添加到类中而不是对象中:
String.metaClass.containsAny={notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
试试这个:
if (Arrays.asList(item1, item2, item3).stream().anyMatch(string::contains))
如果您seraching为整个 单词,你可以做到这一点,工作的情况下, 不区分大小写。
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.
假设Strings是您要在其中搜索的数组,那么以下内容将为您工作:
Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator);
其中,mykeytosearch是要测试数组中是否存在的字符串。mysearchComparator-是用于比较字符串的比较器。
有关更多信息,请参考Arrays.binarySearch。