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?


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.


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.


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

2

Versuche dies,

String session = "Session";
if(session.toLowerCase().startsWith("sEsSi".toLowerCase()))

0

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


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>

-1

Das kannst du immer tun

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

-1

Verwendung beginnt mit und toLowerCase zusammen

so was

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.