testing一个string是否包含数组中的任何string

我如何testing一个string,看它是否包含数组中的任何string?

而不是使用

if (string.contains(item1) || string.contains(item2) || string.contains(item3)) 

编辑:这是使用Java 8 Streaming API的更新。 非常干净 仍然可以与正则expression式结合使用。

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

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

如果你想返回匹配的string,你也可以使用.filter(inputStr::contains).findAny()


原来略显过时的答案:

这是一个(非常基本的)静态方法。 请注意,比较string区分大小写。 使其不区分大小写的原始方法是在inputstring和testingstring上都调用toLowerCase()toUpperCase()

如果你需要做比这更复杂的任何事情,我会build议看看模式和匹配器类,并学习如何做一些正则expression式。 一旦你理解了这些,你可以使用这些类或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; 

string实用程序

使用:

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

它将返回find的string的索引,如果没有find,则返回-1。

你可以像这样使用String#匹配方法:

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

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

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

尝试这个:

 if (Arrays.asList(item1, item2, item3).contains(string)) 

如果您使用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来testing你也可以通过调用parallel()并行化search,代码将会是:

 return Arrays.stream(items).parallel().anyMatch(inputString::contains); 

这是一个解决scheme:

 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.asList(array).contains(string)) 

一个更groovyesque的方法将是使用注入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)}) } 

如果你需要包含任何未来的stringvariables的存在,然后将该方法添加到类而不是对象:

 String.metaClass.containsAny={notAllowedTerms-> notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)}) } 

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

 Pattern pattern = Pattern.compile("\\bitem1 |item2\\b",java.util.regex.Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(input); if(matcher.find() ){ } 
 String.prototype.matchWithTokens = function(tokensArray){ for(i=0; i< tokensArray.length; i++) { if(this.indexOf(tokensArray[i]) != -1) { return true; } } return false; }; 

下面应该为你工作,假设string是你正在search的数组:

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

mykeytosearch是你想要在数组中存在的string。 mysearchComparator – 是一个用于比较string的比较器。

请参阅Arrays.binarySearch以获取更多信息。