465 Stimmen

Wie kann man in Java prüfen, ob eine Zeichenkette eine andere Zeichenkette enthält, ohne die Groß- und Kleinschreibung zu berücksichtigen?

Angenommen, ich habe zwei Strings,

String s1 = "AbBaCca";
String s2 = "bac";

Ich möchte eine Prüfung durchführen, die Folgendes zurückgibt s2 ist enthalten in s1 . Ich kann dies mit tun:

return s1.contains(s2);

Ich bin mir ziemlich sicher, dass contains() zwischen Groß- und Kleinschreibung unterscheidet, aber ich kann das aus der Dokumentation nicht mit Sicherheit herauslesen. Wenn es ist, dann nehme ich an, meine beste Methode wäre etwas wie:

return s1.toLowerCase().contains(s2.toLowerCase());

Abgesehen davon, gibt es eine andere (möglicherweise bessere) Möglichkeit, dies zu erreichen, ohne sich um die Groß- und Kleinschreibung zu kümmern?

2voto

Takhir Atamuratov Punkte 151
"AbCd".toLowerCase().contains("abcD".toLowerCase())

1voto

SCdF Punkte 53953

Ich bin mir nicht sicher, was Ihre Hauptfrage hier ist, aber ja, bei .enthält wird zwischen Groß- und Kleinschreibung unterschieden.

0voto

Oder Sie können einen einfachen Ansatz verwenden und einfach die Groß-/Kleinschreibung der Zeichenkette in die Groß-/Kleinschreibung der Teilzeichenkette umwandeln und dann die Methode contains verwenden.

0voto

Stéphane GRILLON Punkte 9794
import java.text.Normalizer;

import org.apache.commons.lang3.StringUtils;

public class ContainsIgnoreCase {

    public static void main(String[] args) {

        String in = "   Annulée ";
        String key = "annulee";

        // 100% java
        if (Normalizer.normalize(in, Normalizer.Form.NFD).replaceAll("[\\p{InCombiningDiacriticalMarks}]", "").toLowerCase().contains(key)) {
            System.out.println("OK");
        } else {
            System.out.println("KO");
        }

        // use commons.lang lib
        if (StringUtils.containsIgnoreCase(Normalizer.normalize(in, Normalizer.Form.NFD).replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""), key)) {
            System.out.println("OK");
        } else {
            System.out.println("KO");
        }

    }

}

0voto

Revertron Punkte 1013

Wenn Sie eine ASCII-Zeichenkette in einer anderen ASCII-Zeichenkette suchen müssen, z. B. in einer URL werden Sie meine Lösung für besser halten. Ich habe die Methode von icza und meine für die Geschwindigkeit getestet und hier sind die Ergebnisse:

  • Fall 1 dauerte 2788 ms - regionMatches
  • Fall 2 dauerte 1520 ms - mein

Der Code:

public static String lowerCaseAscii(String s) {
    if (s == null)
        return null;

    int len = s.length();
    char[] buf = new char[len];
    s.getChars(0, len, buf, 0);
    for (int i=0; i<len; i++) {
        if (buf[i] >= 'A' && buf[i] <= 'Z')
            buf[i] += 0x20;
    }

    return new String(buf);
}

public static boolean containsIgnoreCaseAscii(String str, String searchStr) {
    return StringUtils.contains(lowerCaseAscii(str), lowerCaseAscii(searchStr));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X