Як використовувати метод `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.