Es gab keinen Grund, diese Frage zu schließen. Die beste Lösung ist jedoch die Verwendung, bei string.regionMatches(true, 0, prefix, 0, prefix.length());der die Kosten für die "Normalisierung" beider Zeichenfolgen nicht anfallen.
Isapir
@ AlexanderAbakumov Gut von mir. Die richtige Antwort finden Sie in meinem Kommentar oben. Es ist viel effizienter als das Ändern des Falls von Zeichenfolgen. Es wäre gut, es auf eine Antwort anstatt auf einen Kommentar zu aktualisieren.
Isapir
Antworten:
98
Verwenden Sie toUpperCase()oder toLowerCase(), um Ihre Zeichenfolge zu standardisieren, bevor Sie sie testen.
Das große Problem hierbei ist die Leistung. Für kleine Strings kein Problem, aber wenn Sie einen großen haben ... ich meine ... werden Sie wirklich einen toUpperCase in einem 1-MB-String machen, nur um 4-10 offizielle Zeichen zu vergleichen?
Dyorgio
4
Hum, auch wenn ich nicht sehen kann, warum ich den Startteil eines 1-MB-Strings vergleichen möchte, wenn mich nur 4 - 10 Anfangszeichen interessieren, verwende ich Teilzeichenfolge und normalisiere und fertig ...
Nemesis
3
Diese Antwort (und alle anderen hier gefundenen Antworten) sind falsch. Wenn Sie sich die Implementierung von ansehen, werden String.equalsIgnoreCase()Sie feststellen, dass Sie sowohl Klein- als auch Großbuchstaben der Strings vergleichen müssen, bevor Sie endgültig zurückkehren können false. Eine alternative Antwort finden Sie unter stackoverflow.com/a/38947571/14731 .
Gili
10
Diese Antwort ist nicht wahr, da toLowerCase () Locale.getDefault () intern verwendet, um die Zeichen zu ändern, was zu falschen Negativen führen kann. Angenommen, Sie möchten "Istanbul" mit "Istanbul" vergleichen. Im Türkischen ist das Kleinbuchstabenäquivalent "ı". Wenn ich das versuche "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(in einer Locale.Turkish-Umgebung), werde ich falsch sein.
Mustafa Berkay Mutlu
1
@Nemesis, Diese Antwort ist falsch, da sie als akzeptierte Antwort für viele Menschen irreführend sein kann. Würden Sie bitte Ihre Antwort bearbeiten und auf die Antwort von Rohit Jain verlinken?
Moha das allmächtige Kamel
87
Eine Möglichkeit besteht darin, beide in Klein- oder Großbuchstaben umzuwandeln:
Eine andere Option ist die Verwendung einer String#regionMatches()Methode, die ein boolesches Argument verwendet, das angibt, ob zwischen Groß- und Kleinschreibung unterschieden werden soll oder nicht. Sie können es so verwenden:
Sie prüft , ob die Region needlevon Index 0bis Länge 5in vorhanden ist , haystackaus dem Index beginnend 0bis Länge 5oder nicht. Das erste Argument truebedeutet, dass die Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung erfolgt.
Und wenn Sie nur ein großer Fan von Regex sind , können Sie so etwas tun:
Angenommen, es gibt eine Tabelle mit mehr als 1 Lakh-Einträgen, und ich verwende eine for-Schleife für eine bestimmte Spalte, um alle diese Einträge zu analysieren. Dabei versuche ich, diese Option in Kleinbuchstaben oben zu verwenden, um einen Eintrag zu suchen, der mit einem bestimmten Muster beginnt . Dies verursacht also ein Leistungsproblem. Wenn überhaupt keine Übereinstimmung gefunden wird, werden intern alle Einträge analysiert, was viel Zeit in Anspruch nimmt, da gleichzeitig auch Kleinbuchstaben konvertiert werden. Gibt es also eine andere Möglichkeit, um Leistungsprobleme zu beheben?
Sheetal Bhatewara
@Rohit Jain, eigentlich das: System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));ist keine richtige Lösung. Sie können dies versuchen: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));mit VM-Argumenten -Duser.country=TR -Duser.language=tr In diesem Beispiel Iist das Großbuchstabeni
string.regionMatches(true, 0, prefix, 0, prefix.length());
der die Kosten für die "Normalisierung" beider Zeichenfolgen nicht anfallen.Antworten:
Verwenden Sie
toUpperCase()
odertoLowerCase()
, um Ihre Zeichenfolge zu standardisieren, bevor Sie sie testen.quelle
String.equalsIgnoreCase()
Sie feststellen, dass Sie sowohl Klein- als auch Großbuchstaben der Strings vergleichen müssen, bevor Sie endgültig zurückkehren könnenfalse
. Eine alternative Antwort finden Sie unter stackoverflow.com/a/38947571/14731 ."İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())
(in einer Locale.Turkish-Umgebung), werde ich falsch sein.Eine Möglichkeit besteht darin, beide in Klein- oder Großbuchstaben umzuwandeln:Das ist falsch. Siehe: https://stackoverflow.com/a/15518878/14731Eine andere Option ist die Verwendung einer
String#regionMatches()
Methode, die ein boolesches Argument verwendet, das angibt, ob zwischen Groß- und Kleinschreibung unterschieden werden soll oder nicht. Sie können es so verwenden:Sie prüft , ob die Region
needle
von Index0
bis Länge5
in vorhanden ist ,haystack
aus dem Index beginnend0
bis Länge5
oder nicht. Das erste Argumenttrue
bedeutet, dass die Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung erfolgt.Und wenn Sie nur ein großer Fan von Regex sind , können Sie so etwas tun:
(?i)
Das eingebettete Flag dient zum Ignorieren der Fallübereinstimmung.quelle
System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));
ist keine richtige Lösung. Sie können dies versuchen:System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));
mit VM-Argumenten-Duser.country=TR -Duser.language=tr
In diesem BeispielI
ist das Großbuchstabeni
quelle
Versuche dies,
quelle
Sie können verwenden
someString.toUpperCase().startsWith(someOtherString.toUpperCase())
quelle
Ich weiß, dass ich zu spät bin, aber was ist mit StringUtils.startsWithIgnoreCase () von Apache Commons Lang 3?
Beispiel:
Fügen Sie Ihrer pom.xml-Datei einfach die folgende Abhängigkeit hinzu (unter der Annahme, dass Sie Maven verwenden):
quelle
Das kannst du immer tun
quelle
Verwendung beginnt mit und toLowerCase zusammen
so was
quelle