java contains без учета регистра

Как проверить, содержит ли строка другую строку без учета регистра в Java?

Скажем, у меня две струны,

Я почти уверен, что contains() чувствителен к регистру, однако я не могу точно определить это, читая документацию. Если это так, то я полагаю, что моим лучшим методом будет что-то вроде:

Помимо всего этого, есть ли другой (возможно, лучший) способ сделать это, не заботясь о чувствительности к регистру?

20 ответов

Да, содержит с учетом регистра. Вы можете использовать java.util.regex.Pattern с флагом CASE_INSENSITIVE для сопоставления без учета регистра:

РЕДАКТИРОВАТЬ: Если s2 содержит специальные символы регулярных выражений (которых много), важно сначала указать их в кавычках. Я исправил свой ответ, так как он будет первым, что увидят люди, но проголосуйте за Мэтта Куэла, поскольку он указал на это.

Ты можешь использовать

Библиотека Apache Commons очень полезна для такого рода вещей. И это конкретное выражение может быть лучше, чем регулярные выражения, поскольку регулярное выражение всегда дорого с точки зрения производительности.

Более быстрое внедрение: использование String.regionMatches()

Использование регулярного выражения может быть относительно медленным. Это (медлительность) не имеет значения, если вы просто хотите проверить в одном случае. Но если у вас есть массив или коллекция из тысяч или сотен тысяч строк, работа может замедлиться.

Представленное ниже решение не использует ни регулярные выражения, ни toLowerCase() (что также является медленным, поскольку создает другие строки и просто выбрасывает их после проверки).

Анализ скорости

Этот анализ скорости не означает ракетостроения, это просто грубая картина того, насколько быстры различные методы.

Сравниваю 5 методов.

Результаты (вызвав метод 10 миллионов раз):

Результаты в таблице:

Код теста анализа

Если вам интересно, как проводился анализ, вот полное работающее приложение:

Источник

Как проверить, содержит ли строка другую строку без учета регистра в Java?

скажем, у меня есть две строки

я почти уверен, что contains() чувствителен к регистру, однако я не могу точно определить это из чтения документации. Если это так, то я полагаю, что мой лучший метод будет чем-то вроде:

все это в сторону, есть другой (возможно лучший) способ сделать это, не заботясь о чувствительность к регистру?

17 ответов

да, contains чувствителен к регистру. Вы можете использовать Java.утиль.регулярное выражение.Шаблон с флагом CASE_INSENSITIVE для сопоставления без учета регистра:

EDIT: если s2 содержит специальные символы regex (которых много), важно сначала процитировать его. Я исправил свой ответ, так как это первый, который люди увидят, но проголосуйте за Мэтта Куэйла, так как он указал на это.

вы хотите вызвать шаблон.цитата() на с2:

на Apache Commons библиотека очень полезна для такого рода вещей. И этот конкретный может быть лучше, чем регулярные выражения, поскольку регулярное выражение всегда дорого с точки зрения производительности.

Более Быстрая Реализация: Использование String.regionMatches()

использование regexp может быть относительно медленным. Он (медлительность) не имеет значения, если вы просто хотите проверить в одном случае. Но если у вас есть массив или коллекция из тысяч или сотен тысяч строк, все может идти довольно медленно.

в представленном ниже решении не используются регулярные выражения и toLowerCase() (который также медленный, потому что он создает другие строки и просто выбрасывает их после проверять.)

решение основывается на строку.regionMatches() метод, который, кажется, неизвестно. Он проверяет, если 2 String регионы совпадают, но важно то, что он также имеет перегрузку с удобным

этот код вернет строку » TRUE!- так же, как и то, что в нем содержались ваши персонажи.

более простым способом сделать это (не беспокоясь о сопоставлении шаблонов) будет преобразование обоих String s в нижнем регистре:

можно использовать регулярные выражения и это работает:

вот некоторые Unicode-дружественные, которые вы можете сделать, если вы вытащите ICU4j. Я думаю, что «игнорировать случай» сомнительно для имен методов, потому что, хотя первичные сравнения силы игнорируют случай, он описывается как специфика, зависящая от локали. Но, надеюсь, это зависит от локали так, как пользователь ожидал бы.

Я сделал тест, найдя нечувствительное к регистру совпадение строки. У меня есть вектор из 150 000 объектов со строкой как одно поле и хотел найти подмножество, которое соответствует строке. Я попробовал три метода:—4—>

конвертировать все в нижний регистр

используйте метод String matches ()

использовать регулярные выражения

результаты сроки являются:

нет попытки совпадения: 20 мс

понизить матч: 182 МС

регулярное выражение: 65 мс

регулярное выражение выглядит самым быстрым для этого случая использования.

в основном, это метод, который принимает две строки. Предполагается, что это не чувствительная к регистру версия contains(). При использовании метода contains вы хотите увидеть, содержится ли одна строка в другой.

этот метод принимает строку, которая является «sub», и проверяет, равна ли она подстрокам строки контейнера, которые равны по длине»sub». Если вы посмотрите на for цикл, вы увидите, что он повторяется в подстроках (это длина «sub») над строкой контейнера.

каждая итерация проверяет, является ли подстрока строки контейнера equalsIgnoreCase суб.

Если вам нужно искать строку ASCII в другой строке ASCII, например URL-адресом, вы найдете мое решение будет лучше. Я протестировал метод icza и мой для скорости, и вот результаты:

Источник

Java: как проверить, содержит ли строка подстроку

87696877654621131721831572400812249494

Основные способы Java

String.contains()

Часто, чтобы избежать этой проблемы, так как мы не хотим быть чувствительны к регистру, вы должны сопоставить регистр обеих строк перед проверкой:

String.indexOf()

Мы можем либо искать один символ со смещением или без него, либо искать строку со смещением или без него.

Запуск этого кода даст:

String.lastIndexOf()

Запуск этого кода даст:

Некоторые могут быть немного удивлены результатами и скажут:

Шаблон с регулярным выражением и Matcher

Класс Pattern существенно скомпилированное представление регулярного выражения. Он используется вместе с классом Matcher для сопоставления последовательностей символов.

Apache Commons

Из-за его полезности и распространенности в Java, во многих проектах Apache Commons включен в classpath. Это отличная библиотека со многими полезными функциями, часто используемыми в производстве, и проверка подстрок не является исключением.

Или добавив его через Gradle:

StringUtils.contains()

Единственное отличие состоит в том, что мы не вызываем метод для проверяемой строки (поскольку он не наследует этот метод), а вместо этого передаем искомую строку вместе со строкой, которую мы ищем:

Запуск этого кода даст:

Примечание: этот метод чувствителен к регистру.

StringUtils.indexOf()

Запуск этого кода даст:

StringUtils.indexOfAny()

Запуск этого кода даст:

StringUtils.indexOfAnyBut()

Запуск этого кода даст:

StringUtils.indexOfDifference()

Запуск этого кода даст:

StringUtils.indexOfIgnoreCase()

Запуск этого кода даст:

StringUtils.lastIndexOf()

Запуск этого кода даст:

StringUtils.containsIgnoreCase()

Запуск этого кода даст:

StringUtils.containsOnly()

Примечание: не все символы из последовательности необходимо использовать в методе string для возврата true. Важно то, что в нем нет символа, которого нет в последовательности символов.

StringUtils.containsNone()

Запуск этого кода дает:

StringUtils.containsAny()

Источник

Как проверить, содержит ли строка другую строку без учета регистра в Java?

Скажем, у меня есть две строки,

Я уверен, что contains() это чувствительно к регистру, но я не могу определить это наверняка, прочитав документацию. Если это так, то я полагаю, что мой лучший метод будет что-то вроде:

Помимо всего этого, есть ли другой (возможно, лучший) способ сделать это, не заботясь о чувствительности к регистру?

Да, содержит с учетом регистра. Вы можете использовать java.util.regex.Pattern с флагом CASE_INSENSITIVE для сопоставления без учета регистра:

РЕДАКТИРОВАТЬ: Если s2 содержит специальные символы регулярных выражений (из которых их много), важно сначала процитировать его. Я исправил свой ответ, так как это первый, который увидят люди, но проголосуйте за Мэтта Квила, так как он указал на это.

Вы хотите вызвать Pattern.quote () на s2:

Ты можешь использовать

Библиотека Apache Commons очень полезна для такого рода вещей. И этот конкретный может быть лучше, чем регулярные выражения, так как регулярное выражение всегда дорого с точки зрения производительности.

Быстрая реализация: использование String.regionMatches()

Использование регулярных выражений может быть относительно медленным. Это (медленно) не имеет значения, если вы просто хотите проверить в одном случае. Но если у вас есть массив или набор из тысяч или сотен тысяч строк, все может стать довольно медленным.

Представленное ниже решение не использует ни регулярные выражения, ни toLowerCase() (что также является медленным, потому что оно создает другие строки и просто выбрасывает их после проверки).

Решение основано на методе String.regionMatches (), который кажется неизвестным. Он проверяет, String совпадают ли 2 области, но важно то, что он также имеет перегрузку с удобным ignoreCase параметром.

Анализ скорости

Этот анализ скорости не означает ракетостроение, это лишь приблизительная картина того, насколько быстры разные методы.

Я сравниваю 5 методов.

Результаты (вызвав метод 10 миллионов раз):

Результаты в таблице:

Анализ тестового кода

Если вам интересно, как был проведен анализ, вот вам готовое приложение:

Источник

Как проверить, содержит ли строка другую строку без учета регистра в Java?

Скажем, у меня есть две строки,

Я уверен, что contains() чувствителен к регистру, однако я не могу определить это наверняка, прочитав документацию. Если это так, то я полагаю, что мой лучший метод будет что-то вроде:

Помимо всего этого, есть ли другой (возможно, лучший) способ сделать это, не заботясь о чувствительности к регистру?

21 ответ

Да, содержит регистр. Вы можете использовать java.util.regex.Pattern с флагом CASE_INSENSITIVE для сопоставления без учета регистра:

РЕДАКТИРОВАТЬ: Если s2 содержит специальные символы регулярных выражений (из которых их много), важно сначала процитировать его. Я исправил свой ответ, так как это первый, который увидят люди, но проголосуйте за Мэтта Квила, так как он указал на это.

Вы хотите вызвать Pattern.quote() на s2:

Ты можешь использовать

Библиотека Apache Commons очень полезна для такого рода вещей. И этот конкретный может быть лучше, чем регулярные выражения, так как регулярное выражение всегда дорого с точки зрения производительности.

Более быстрое внедрение: использование String.regionMatches()

Использование регулярных выражений может быть относительно медленным. Это (медленно) не имеет значения, если вы просто хотите проверить в одном случае. Но если у вас есть массив или набор из тысяч или сотен тысяч строк, все может стать довольно медленным.

Представленное ниже решение не использует ни регулярные выражения, ни toLowerCase() (что также медленно, потому что создает другие строки и просто выбрасывает их после проверки).

Решение основано на методе String.regionMatches(), который кажется неизвестным. Это проверяет, если 2 String регионы совпадают, но важно то, что он также имеет перегрузку с удобной ignoreCase параметр.

Анализ скорости

Этот анализ скорости не означает ракетостроение, это лишь приблизительная картина того, насколько быстры разные методы.

Я сравниваю 5 методов.

Результаты (вызвав метод 10 миллионов раз):

Результаты в таблице:

Анализ тестового кода

Если вам интересно, как был проведен анализ, вот вам готовое приложение:

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • jasion es pro приложение
  • jar приложение чем открыть