Як використовувати метод `string.startsWith ()` ігнорування випадку?


115

Я хочу використовувати string.startsWith()метод, але ігноруючи випадок.

Припустимо, у мене є String"Сесія", і я використовую startsWith"sEsSi", тоді він повинен повернутися true.

Як я можу цього досягти?


5
Не було підстав закривати це питання. У будь-якому випадку, найкращим рішенням є використання, string.regionMatches(true, 0, prefix, 0, prefix.length());яке не несе витрат на "нормалізацію" обох рядків.
isapir

@AlexanderAbakumov Мене чудово. Правильна відповідь розміщена в моєму коментарі вище. Це набагато ефективніше, ніж зміна корпусу струн. Було б добре доповнити його відповіддю, а не коментарем.
isapir

Відповіді:


98

Використовуйте toUpperCase()або toLowerCase()стандартизуйте рядок перед її тестуванням.


8
Велика проблема тут - продуктивність. Для маленьких струн це не проблема, але якщо у вас є велика ... Я маю на увазі ... Ви дійсно зробите toUpperCase в 1mb-рядку лише для порівняння 4-10 первісних символів?
Діоргіо

4
Хам, навіть якщо я не можу зрозуміти, чому я хотів би порівняти початкову частину рядка 1 Мб, то якщо мене цікавлять лише 4 - 10 початкових символів, я використовую підрядку, а потім нормалізую і виконаю ...
Nemesis

3
Ця відповідь (та всі інші відповіді, знайдені тут) є неправильною. Якщо ви подивитесь на реалізаціюString.equalsIgnoreCase() ви побачите, що вам потрібно порівняти як малі, так і великі версії рядків, перш ніж ви зможете безумовно повернутися false. Дивіться stackoverflow.com/a/38947571/14731 для альтернативної відповіді.
Гілі

10
Ця відповідь не відповідає дійсності, оскільки toLowerCase () використовує Locale.getDefault () внутрішньо для зміни знаків, що може призвести до помилкових негативів. Скажімо, ви хочете порівняти "Стамбул" з "Стамбул". У турецькій мові "İ" нижній регістр - "ı". Тож коли я спробую це зробити "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(у середовищі Locale.Turkish), це призведе до помилки.
Мустафа Беркай Мутлу

1
@Nemesis, ця відповідь неправильна, оскільки прийнята відповідь може ввести в оману для багатьох людей. Скажіть, будь ласка, відредагуйте свою відповідь та посилання на відповідь Рохіта Джайна
Моха всемогутній верблюд

88

Один із варіантів - перетворити обидва в малі або великі регістри:

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

Це неправильно. Дивіться: https://stackoverflow.com/a/15518878/14731


Іншим варіантом є використання String#regionMatches()методу, який приймає логічний аргумент, вказуючи, чи слід робити відповідність регістру чи ні. Ви можете використовувати його так:

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

Він перевіряє, чи є область needle від індексу 0до довжини 5, haystackпочинаючи від індексу 0до довжини 5чи ні. Перший аргумент - trueце означає, що це зробить невідповідність регістру.


І якщо ви лише великий фанат Regex , ви можете зробити щось подібне:

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

(?i) Вбудований прапор призначений для ігнорування відповідності випадків.


1
Насправді, припустимо, є таблиця, яка містить більше 1 записів на lakh, і я використовую цикл для певного стовпця, щоб проаналізувати всі ці записи, і в цьому я намагаюся використовувати цей нижній регістр вище, щоб шукати запис, починаючи з певного шаблону . Отже, це спричиняє проблеми з продуктивністю. Якщо збігу взагалі не знайдено, то внутрішньо він буде проаналізувати всі записи, що займе багато часу, одночасно його перетворення також на малі регістри. То чи є інший варіант вирішення проблеми ефективності?
Sheetal Bhatewara

@Rohit Jain, насправді це: System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));не рішення проппер. Ви можете спробувати це: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));з аргументами vm. -Duser.country=TR -Duser.language=tr У цьому прикладі Iверхній регістрi
DPM



1

Я знаю, що я спізнююсь, але як бути з використанням StringUtils.startsWithIgnoreCase () від Apache Commons Lang 3?

Приклад:

StringUtils.startsWithIgnoreCase(string, "start");

Просто додайте таку залежність до вашого файлу pom.xml (беручи до уваги гіпотезу, що ви використовуєте Maven):

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



-1

використання починається з та toLowerCase разом

подобається це

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.