Как использовать метод `string.startsWith ()` игнорируя регистр?


115

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

Предположим, у меня есть String"Session" и я использую startsWith"sEsSi", тогда он должен вернуться true.

Как я могу этого добиться?


5
Не было причин закрывать этот вопрос. В любом случае, лучшим решением является использование, string.regionMatches(true, 0, prefix, 0, prefix.length());которое не требует затрат на «нормализацию» обеих строк.
isapir 06

@AlexanderAbakumov Прекрасно с моей стороны. Правильный ответ размещен в моем комментарии выше. Это намного эффективнее, чем изменение регистра строк. Было бы хорошо обновить его до ответа, а не комментария.
isapir

Ответы:


98

Используйте toUpperCase()или, toLowerCase()чтобы стандартизировать вашу строку перед ее тестированием.


8
Большая проблема здесь - производительность. Для маленьких строк нет проблем, но если у вас есть большой ... Я имею в виду ... Вы действительно будете использовать toUpperCase в строке размером 1 МБ, чтобы сравнить 4-10 начальных символов?
Dyorgio

4
Хм, даже если я не понимаю, почему я хотел бы сравнить начальную часть строки размером 1 МБ, тогда, если меня интересуют только 4-10 начальных символов, я использую подстроку, а затем нормализую и готово ...
Немезида

3
Этот ответ (и все другие ответы, найденные здесь) неверны. Если вы посмотрите на реализацию String.equalsIgnoreCase()вы обнаружите , что вам нужно сравнить как строчные , так и прописные версии строк , прежде чем окончательно вернуться false. См. Stackoverflow.com/a/38947571/14731 для альтернативного ответа.
Gili

10
Этот ответ неверен, потому что toLowerCase () использует Locale.getDefault () внутри для изменения символов, что может привести к ложноотрицательным результатам. Допустим, вы хотите сравнить «Стамбул» с «Стамбулом». В турецком "İ" нижний регистр эквивалентен "ı". Поэтому, когда я пытаюсь сделать это "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(в среде Locale.Turkish), это даст мне false.
Мустафа Беркай Мутлу

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 миллиона записей, и я использую цикл for для определенного столбца для анализа всех этих записей, и в этом случае я пытаюсь использовать этот параметр нижнего регистра выше для поиска записи, начинающейся с определенного шаблона . Итак, это вызывает проблемы с производительностью. Если совпадений не найдено вообще, то он внутренне проанализирует все записи, что займет много времени, так как одновременно оно будет преобразовано в нижний регистр. Так есть ли другой вариант решения проблемы с производительностью?
Sheetal Bhatewara 08

@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



2

Я знаю, что опаздываю, но как насчет использования 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.