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以获取更多信息。