如何测试一个字符串是否包含数组中任何字符串?
不要使用
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
如何测试一个字符串是否包含数组中任何字符串?
不要使用
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
编辑:这里是使用Java 8流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()
。
如果您需要执行任何比这更复杂的操作,建议查看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;
}
char[]
转换为 String[]
,这似乎不太对。 - Brentspineimport 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).*$"));
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。一旦它在 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
。 - Beau Grantham.equals()
,这非常令人困惑。我认为他们需要编辑他们的问题。 - gnomed试试这个:
if (Arrays.stream(new String[] {item1, item2, item3}).anyMatch(inputStr::contains))
stream()
和anyMatch()
需要API级别24或以上。 - Dilanka Laksiri这里有一个解决方案:
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;
}
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.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.
.*
就可以省略 ?
和 $
的使用,因为 .*
表示"零个或多个任意字符"(除了某些控制字符)。 - Max Cascone