文字列をテストして、配列の文字列が含まれているかどうかを確認するにはどうすればよいですか?
使用する代わりに
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).parallel().anyMatch(inputStr::contains);
}
また、入力タイプを配列ではなくリストに変更する場合は、items.parallelStream().anyMatch(inputStr::contains)
を使用できます。
一致する文字列を返す場合は、.filter(inputStr::contains).findAny()
を使用することもできます。
元のわずかに古い答え:
これは(非常に基本的な)静的メソッドです。比較文字列では大文字と小文字が区別されることに注意してください。 primitive大文字と小文字を区別しない方法は、入力文字列とテスト文字列の両方で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));
}
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);
これを試して:
if (Arrays.asList(item1, item2, item3).contains(string))
1つの解決策は次のとおりです。
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;
}
バージョン3.4以降、Apache Common Lang 3は containsAny メソッドを実装しています。
大文字と小文字を区別しない一致を探している場合は、パターンを使用します
Pattern pattern = Pattern.compile("\\bitem1 |item2\\b",Java.util.regex.Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(input);
if(matcher.find() ){
}
よりグルーヴィーなアプローチは、injectを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)})
}
将来の文字列変数にcontainsAnyが必要な場合は、オブジェクトの代わりにクラスにメソッドを追加します。
String.metaClass.containsAny={notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}