如何测试字符串以查看它是否包含数组中的任何字符串?
而不是使用
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
编辑:这是使用 Java 8 Streaming 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()
完成,但大多数情况下这实际上会影响性能。请参阅this question for more details on parallel streaming。
原始的稍微过时的答案:
这是一个(非常基本的)静态方法。请注意,比较字符串区分大小写。使其不区分大小写的原始方法是在输入字符串和测试字符串上调用 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 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);
最简单的方法可能是将数组转换为 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()
,这非常令人困惑。我认为他们需要编辑他们的问题
这是一种解决方案:
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;
}
尝试这个:
if (Arrays.stream(new String[] {item1, item2, item3}).anyMatch(inputStr::contains))
stream()
和 anyMatch()
需要 API 级别 24 或更高
一种更常规的方法是将注入与 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 (string.matches("^.*?((?i)item1|item2|item3).*$"))
(?i): used for case insensitive
.*? & .*$: used for checking whether it is present anywhere in between the string.
.*
包装结尾会使 ?
和 $
变得多余,因为 .*
表示“零个或多个任何字符”(带有一些控制字符警告)
如果您正在搜索整个单词,您可以这样做不区分大小写。
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;
}
如果您正在寻找不区分大小写的匹配,请使用模式
Pattern pattern = Pattern.compile("\\bitem1 |item2\\b",java.util.regex.Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
...
}
在科特林
if (arrayOf("one", "two", "three").find { "onetw".contains(it) } != null){
doStuff()
}
假设 Strings 是您要在其中搜索的数组,以下内容应该适用于您:
Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator);
其中 mykeytosearch 是要测试是否存在于数组中的字符串。 mysearchComparator - 是用于比较字符串的比较器。
有关详细信息,请参阅 Arrays.binarySearch。
if (Arrays.asList(array).contains(string))
不定期副业成功案例分享