Jak używać metody `string.startsWith ()` ignorując wielkość liter?


115

Chcę użyć string.startsWith()metody, ale ignorując przypadek.

Załóżmy, że mam String„Session” i używam startsWithna „sEsSi”, to powinno powrócić true.

Jak mogę to osiągnąć?


5
Nie było powodu, aby zamykać to pytanie. Zresztą najlepszym rozwiązaniem jest użycie, string.regionMatches(true, 0, prefix, 0, prefix.length());które nie wiąże się z kosztem „normalizacji” obu łańcuchów.
isapir

@AlexanderAbakumov Fine by me. Prawidłowa odpowiedź znajduje się w moim komentarzu powyżej. Jest to znacznie wydajniejsze niż zmiana wielkości liter w strunach. Byłoby dobrze, gdyby zamienić go na odpowiedź, a nie komentarz.
isapir

Odpowiedzi:


98

Użyj toUpperCase()lub, toLowerCase()aby ustandaryzować swój ciąg przed jego przetestowaniem.


8
Dużym problemem jest tutaj wydajność. W przypadku małych ciągów nie ma problemu, ale jeśli masz duży… To znaczy… Czy naprawdę zrobisz toUpperCase w ciągu 1mb tylko po to, aby porównać 4-10 znaków początkowych?
Dyorgio,

4
Hum, nawet jeśli nie rozumiem, dlaczego chciałbym porównać początkową część ciągu 1mb, to jeśli interesuje mnie tylko 4 - 10 początkowych znaków, używam podłańcucha, a następnie normalizuję i gotowe ...
Nemesis

3
Ta odpowiedź (i wszystkie inne odpowiedzi tutaj) są błędne. Jeśli spojrzysz na implementację String.equalsIgnoreCase(), odkryjesz, że musisz porównać wersje ciągów napisane zarówno małymi, jak i dużymi literami, zanim będziesz mógł ostatecznie wrócić false. Alternatywną odpowiedź można znaleźć na stackoverflow.com/a/38947571/14731 .
Gili

10
Ta odpowiedź nie jest prawdziwa, ponieważ toLowerCase () używa Locale.getDefault () wewnętrznie do zmiany znaków, co może prowadzić do fałszywych negatywów. Powiedzmy, że chcesz porównać „Stambuł” ze „Stambułem”. W tureckim odpowiednikiem małej litery „İ” jest „ı”. Więc kiedy spróbuję to zrobić "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(w środowisku Locale.Turkish), da mi to fałsz.
Mustafa Berkay Mutlu

1
@Nemesis, ta odpowiedź jest błędna, uznanie jej za akceptowaną może być mylące dla wielu ludzi. Czy mógłbyś edytować swoją odpowiedź i link do odpowiedzi Rohit Jain.
Moha the allmighty camel

88

Jedną z opcji jest przekonwertowanie obu na małe lub duże litery:

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

To jest źle. Zobacz: https://stackoverflow.com/a/15518878/14731


Inną opcją jest użycie String#regionMatches()metody, która pobiera argument logiczny określający, czy dopasować z uwzględnieniem wielkości liter, czy nie. Możesz go używać w ten sposób:

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

Sprawdza, czy obszar needleod indeksu 0do długości 5jest obecny na haystackpoczątku od indeksu 0do długości, 5czy nie. Pierwszy argument to true, oznacza, że ​​dopasuje bez rozróżniania wielkości liter.


A jeśli tylko jesteś wielkim fanem Regex , możesz zrobić coś takiego:

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

(?i) flaga osadzona służy do ignorowania dopasowania wielkości liter.


1
Właściwie przypuśćmy, że istnieje tabela, która ma więcej niż 1 lakh wpisów i używam pętli for w określonej kolumnie, aby przeanalizować wszystkie te wpisy i w tym celu próbuję użyć tej małej opcji powyżej, aby wyszukać wpis zaczynający się od określonego wzorca . To powoduje problem z wydajnością. Jeśli w ogóle nie zostanie znalezione dopasowanie, wewnętrznie przeanalizuje wszystkie wpisy, co zajmie dużo czasu, ponieważ jednocześnie zostanie przekonwertowany na małe litery. Czy jest więc inna opcja rozwiązania problemu z wydajnością?
Sheetal Bhatewara

@Rohit Jain, właściwie to: System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));nie jest odpowiednim rozwiązaniem. Możesz spróbować tego: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));z argumentami vm -Duser.country=TR -Duser.language=tr W tym przykładzie Ijest dużei
DPM

3
myString.toLowerCase().startsWith(starting.toLowerCase());

2

Spróbuj tego,

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

2

Wiem, że się spóźniłem, ale co z użyciem StringUtils.startsWithIgnoreCase () z Apache Commons Lang 3?

Przykład:

StringUtils.startsWithIgnoreCase(string, "start");

Po prostu dodaj następującą zależność do pliku pom.xml (przyjmując hipotezę, że używasz Mavena):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>


-1

Zawsze możesz to zrobić

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

-1

use zaczyna się od i toLowerCase razem

lubię to

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.