it-swarm.com.de

Testen Sie, ob eine Zeichenfolge eine der Zeichenfolgen aus einem Array enthält

Wie teste ich eine Zeichenfolge, um festzustellen, ob sie Zeichenfolgen aus einem Array enthält?

Anstatt zu verwenden

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

BEARBEITEN: Hier ist ein Update mit der Java 8 Streaming API. So viel sauberer. Kann auch mit regulären Ausdrücken kombiniert werden.

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

Wenn wir den Eingabetyp in eine Liste anstelle eines Arrays ändern, können Sie items.parallelStream().anyMatch(inputStr::contains) verwenden.

Sie können auch .filter(inputStr::contains).findAny() verwenden, wenn Sie die passende Zeichenfolge zurückgeben möchten.


Ursprüngliche etwas veraltete Antwort:

Hier ist eine statische Methode (VERY BASIC). Beachten Sie, dass bei den Vergleichszeichenfolgen die Groß- und Kleinschreibung beachtet wird. Eine primitive - Methode, um die Groß- und Kleinschreibung zu berücksichtigen, wäre der Aufruf von toLowerCase() oder toUpperCase() sowohl für die Eingabe- als auch für die Testzeichenfolge.

Wenn Sie etwas komplizierteres als dies tun müssen, würde ich empfehlen, die Klassen Pattern und Matcher anzusehen und zu lernen, wie Sie einige reguläre Ausdrücke verwenden. Sobald Sie diese verstanden haben, können Sie diese Klassen oder die Helper-Methode String.matches() verwenden.

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;
}
135
gnomed
import org.Apache.commons.lang.StringUtils;

String Utils

Benutzen: 

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

Es wird der Index der gefundenen Zeichenfolge oder -1 zurückgegeben, wenn keine gefunden wird.

48
renanleandrof

Sie können String # Matches Methode wie folgt verwenden:

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

Der einfachste Weg wäre wahrscheinlich, das Array in eine Java.util.ArrayList zu konvertieren. Sobald es sich in einer Arrayliste befindet, können Sie die enthaltene Methode leicht nutzen.

public static boolean bagOfWords(String str)
{
    String[] words = {"Word1", "Word2", "Word3", "Word4", "Word5"};  
    return (Arrays.asList(words).contains(str));
}
19
Roy Kachouh

Wenn Sie Java 8 oder höher verwenden, können Sie sich auf die Stream-API verlassen, um dies zu tun:

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);
}

Angenommen, Sie haben ein großes Array von großen String zum Testen, könnten Sie die Suche auch parallel starten, indem Sie parallel() aufrufen. Der Code wäre dann:

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

Versuche dies:

if (Arrays.asList(item1, item2, item3).contains(string))
6
Óscar López

Hier ist eine Lösung:

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;
}
2
serup

Seit Version 3.4 implementieren Apache Common Lang 3 die Methode containsAny .

1
Arthur Vaïsse

Wenn Sie nach Groß- und Kleinschreibung suchen, verwenden Sie Muster

Pattern pattern = Pattern.compile("\\bitem1 |item2\\b",Java.util.regex.Pattern.CASE_INSENSITIVE);

    Matcher matcher = pattern.matcher(input);
    if(matcher.find() ){ 

}
0
vsingh

Ein groovigerer Ansatz wäre die Verwendung von inject in Kombination mit metaClass :

Ich würde gerne sagen:

String myInput="This string is FORBIDDEN"
myInput.containsAny(["FORBIDDEN","NOT_ALLOWED"]) //=>true

Und die Methode wäre:

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

Wenn Sie containsAny für eine zukünftige String-Variable angeben müssen, fügen Sie die Methode der Klasse anstelle des Objekts hinzu:

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