Не было причин закрывать этот вопрос. В любом случае, лучшим решением является использование, string.regionMatches(true, 0, prefix, 0, prefix.length());которое не требует затрат на «нормализацию» обеих строк.
isapir 06
@AlexanderAbakumov Прекрасно с моей стороны. Правильный ответ размещен в моем комментарии выше. Это намного эффективнее, чем изменение регистра строк. Было бы хорошо обновить его до ответа, а не комментария.
isapir
Ответы:
98
Используйте toUpperCase()или, toLowerCase()чтобы стандартизировать вашу строку перед ее тестированием.
Большая проблема здесь - производительность. Для маленьких строк нет проблем, но если у вас есть большой ... Я имею в виду ... Вы действительно будете использовать 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
Один из вариантов - преобразовать их оба в нижний или верхний регистр:
Другой вариант - использовать String#regionMatches()метод, который принимает логический аргумент, указывающий, следует ли выполнять сопоставление с учетом регистра или нет. Вы можете использовать это так:
Он проверяет, присутствует ли область needleот индекса 0до длины 5в haystackначале от индекса 0до длины 5или нет. Первый аргумент trueозначает, что поиск будет выполняться без учета регистра.
И если только вы большой поклонник Regex , вы можете сделать что-то вроде этого:
На самом деле, предположим, что есть таблица, в которой содержится более 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
string.regionMatches(true, 0, prefix, 0, prefix.length());
которое не требует затрат на «нормализацию» обеих строк.Ответы:
Используйте
toUpperCase()
или,toLowerCase()
чтобы стандартизировать вашу строку перед ее тестированием.источник
String.equalsIgnoreCase()
вы обнаружите , что вам нужно сравнить как строчные , так и прописные версии строк , прежде чем окончательно вернутьсяfalse
. См. Stackoverflow.com/a/38947571/14731 для альтернативного ответа."İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())
(в среде Locale.Turkish), это даст мне false.Один из вариантов - преобразовать их оба в нижний или верхний регистр:Это не верно. См .: https://stackoverflow.com/a/15518878/14731Другой вариант - использовать
String#regionMatches()
метод, который принимает логический аргумент, указывающий, следует ли выполнять сопоставление с учетом регистра или нет. Вы можете использовать это так:Он проверяет, присутствует ли область
needle
от индекса0
до длины5
вhaystack
начале от индекса0
до длины5
или нет. Первый аргументtrue
означает, что поиск будет выполняться без учета регистра.И если только вы большой поклонник Regex , вы можете сделать что-то вроде этого:
(?i)
встроенный флаг предназначен для игнорирования регистра.источник
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
источник
попробуй это,
источник
Я знаю, что опаздываю, но как насчет использования StringUtils.startsWithIgnoreCase () из Apache Commons Lang 3?
Пример :
Просто добавьте следующую зависимость в свой файл pom.xml (исходя из гипотезы, что вы используете Maven):
источник
Ты можешь использовать
someString.toUpperCase().startsWith(someOtherString.toUpperCase())
источник
Вы всегда можете сделать
источник
использование начинается с и toLowerCase вместе
как это
источник