Wie verwende ich die Methode string.startsWith (), die den Fall ignoriert?

114

Ich möchte die string.startsWith()Methode verwenden, aber den Fall ignorieren.

Angenommen, ich habe String"Session" und verwende startsWith"sEsSi", dann sollte es zurückkehren true.

Wie kann ich das erreichen?

Sheetal Bhatewara
quelle
5
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.

Nemesis
quelle
7
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:

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());

Das ist falsch. Siehe: https://stackoverflow.com/a/15518878/14731


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:

String haystack = "Session";
String needle = "sEsSi";
System.out.println(haystack.regionMatches(true, 0, needle, 0, 5));  // true

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:

System.out.println(haystack.matches("(?i)" + Pattern.quote(needle) + ".*"));

(?i) Das eingebettete Flag dient zum Ignorieren der Fallübereinstimmung.

Rohit Jain
quelle
1
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
DPM
3
myString.toLowerCase().startsWith(starting.toLowerCase());
agad
quelle
2

Versuche dies,

String session = "Session";
if(session.toLowerCase().startsWith("sEsSi".toLowerCase()))
neuer Benutzer
quelle
0

Sie können verwenden someString.toUpperCase().startsWith(someOtherString.toUpperCase())

Prasad Kharkar
quelle
0

Ich weiß, dass ich zu spät bin, aber was ist mit StringUtils.startsWithIgnoreCase () von Apache Commons Lang 3?

Beispiel:

StringUtils.startsWithIgnoreCase(string, "start");

Fügen Sie Ihrer pom.xml-Datei einfach die folgende Abhängigkeit hinzu (unter der Annahme, dass Sie Maven verwenden):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>
Sébastien Vandamme
quelle
-1

Das kannst du immer tun

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
RamonBoza
quelle
-1

Verwendung beginnt mit und toLowerCase zusammen

so was

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
Rachit
quelle