Comment puis-je tester une chaîne pour voir si elle contient l'une des chaînes d'un tableau?
À la place d'utiliser
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
EDIT: Voici une mise à jour utilisant l’API Java 8 Streaming. Tellement plus propre. Peut encore être combiné avec des expressions régulières aussi.
public static boolean stringContainsItemFromList(String inputStr, String[] items) {
return Arrays.stream(items).parallel().anyMatch(inputStr::contains);
}
De plus, si nous modifions le type d'entrée en une liste au lieu d'un tableau, nous pouvons utiliser items.parallelStream().anyMatch(inputStr::contains)
.
Vous pouvez également utiliser .filter(inputStr::contains).findAny()
si vous souhaitez renvoyer la chaîne correspondante.
Réponse originale légèrement datée:
Voici une méthode statique (TRÈS BASIQUE). Notez qu'il est sensible à la casse sur les chaînes de comparaison. Un moyen de rendre primitive insensible à la casse consiste à appeler toLowerCase()
ou toUpperCase()
à la fois dans les chaînes d'entrée et de test.
Si vous avez besoin de faire quelque chose de plus compliqué que cela, je vous recommande de regarder les classes Pattern et Matcher et d'apprendre à faire des expressions régulières. Une fois que vous les avez compris, vous pouvez utiliser ces classes ou la méthode d'assistance 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;
Utilisation:
StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3})
Il retournera l'index de la chaîne trouvée ou -1 si aucun n'est trouvé.
Vous pouvez utiliser String # correspond à méthode comme ceci:
System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));
Le moyen le plus simple serait probablement de convertir le tableau en un fichier Java.util.ArrayList. Une fois inscrit dans une liste, vous pouvez facilement utiliser la méthode contient.
public static boolean bagOfWords(String str)
{
String[] words = {"Word1", "Word2", "Word3", "Word4", "Word5"};
return (Arrays.asList(words).contains(str));
}
Si vous utilisez Java 8 ou une version ultérieure, vous pouvez vous fier à l’API Stream pour ce faire:
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);
}
En supposant que vous ayez une grande gamme de variables String
à tester, vous pouvez également lancer la recherche en parallèle en appelant parallel()
, le code serait alors:
return Arrays.stream(items).parallel().anyMatch(inputString::contains);
Essaye ça:
if (Arrays.asList(item1, item2, item3).contains(string))
Voici une solution:
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;
}
Depuis la version 3.4, Apache Common Lang 3 implémente la méthode includesAny .
Et si vous recherchez une correspondance insensible à la casse, utilisez le motif
Pattern pattern = Pattern.compile("\\bitem1 |item2\\b",Java.util.regex.Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(input);
if(matcher.find() ){
}
Une approche plus groovyesque serait d’utiliser inject en combinaison avec metaClass :
Je voudrais aimer dire:
String myInput="This string is FORBIDDEN"
myInput.containsAny(["FORBIDDEN","NOT_ALLOWED"]) //=>true
Et la méthode serait:
myInput.metaClass.containsAny={List<String> notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
Si vous avez besoin de containsAny pour être présent pour toute variable de chaîne future, ajoutez la méthode à la classe plutôt que l'objet:
String.metaClass.containsAny={notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}