Как выполнить сравнение строк без учета регистра в JavaScript?
javascript
string
ЭЛЕКТРОДИСТАНЦИОННАЯ СИСТЕМА УПРАВЛЕНИЯ
источник
источник
.localeCompare()
метод javascript. Поддерживается только современными браузерами на момент написания (IE11 +). см. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…"A".localeCompare( "a" );
возвращается1
в консоли Chrome 48."a"
прежде чем"A"
сортируется. Как и"a"
раньше"b"
. Если это поведение нежелательно, можно захотеть.toLowerCase()
каждую букву / строку. то есть."A".toLowerCase().localeCompare( "a".toLowerCase() )
см. developer.mozilla.org/en/docs/Web/JavaScript/Reference/…===
проверит на равенство, но не будет достаточно хорош для сортировки / упорядочивания строк (см. вопрос, на который я изначально ссылался).Ответы:
Самый простой способ сделать это (если вас не беспокоят специальные символы Юникода) - это вызвать
toUpperCase
:источник
if you're not worried about special Unicode characters
.toUpperCase
болееtoLowerCase
?РЕДАКТИРОВАТЬ : Этот ответ был первоначально добавлен 9 лет назад. Сегодня вы должны использовать
localeCompare
сsensitivity: 'accent'
опцией:{ sensitivity: 'accent' }
ГоворитlocaleCompare()
лечить два варианта одной и той же базовой буквой, то же , если они не имеют разные акценты (как в третьем примере) выше.В качестве альтернативы вы можете использовать
{ sensitivity: 'base' }
, который рассматривает два символа как эквивалентные, если их базовый символ одинаков (такA
что будет рассматриваться как эквивалентныйá
).Обратите внимание, что третий параметр
localeCompare
не поддерживается в IE10 или более ранних версиях или в некоторых мобильных браузерах (см. Таблицу совместимости на странице, указанной выше), поэтому, если вам требуется поддержка этих браузеров, вам понадобится некоторый запасной вариант:Оригинальный ответ
Лучший способ выполнить сравнение без учета регистра в JavaScript - это использовать
match()
метод RegExp сi
флагом.Поиск без учета регистра
Когда обе сравниваемые строки являются переменными (не константами), то это немного сложнее, потому что вам нужно сгенерировать RegExp из строки, но передача строки в конструктор RegExp может привести к некорректным или неудачным совпадениям, если строка имеет специальное регулярное выражение персонажи в нем.
Если вы заботитесь о интернационализации, не используйте
toLowerCase()
или,toUpperCase()
поскольку она не обеспечивает точного сравнения без учета регистра на всех языках.http://www.i18nguy.com/unicode/turkish-i18n.html
источник
'a'.localeCompare('A')
и, как и операции, я ищу сравнения строк без учета регистра.localeCompare
версия требует, чтобы двигатель JavaScript поддерживает API ECMAScript® Интернационализация , что он не обязан выполнять. Поэтому, прежде чем полагаться на него, вы можете проверить, работает ли он в среде, которую вы используете. Например:const compareInsensitive = "x".localeCompare("X", undefined, {sensitivity: "base"}) === 0 ? (a, b) => a.localeCompare(b, undefined, {sensitivity: "base"}) : (a, b) => a.toLowerCase().localeCompare(b.toLowerCase());
или что-то подобное.Как сказано в последних комментариях,
string::localeCompare
поддерживает сравнения без учета регистра (среди других мощных вещей).Вот простой пример
И универсальная функция, которую вы могли бы использовать
Обратите внимание, что вместо
undefined
вас, вероятно, следует указать конкретную локаль, с которой вы работаете. Это важно, как указано в документах MDN.Варианты чувствительности
Поддержка браузера
По состоянию на момент публикации, UC Browser для Android и Opera Mini не поддерживает региональные и опционные параметры. Пожалуйста, проверьте https://caniuse.com/#search=localeCompare для получения актуальной информации.
источник
С помощью регулярного выражения также мы можем достичь.
/i
для игнорирования дела. Если в этом нет необходимости, мы можем проигнорировать и проверить на НЕ совпадение с учетом регистра, напримеристочник
keyWORD
будет иметь положительный результат. Но строкаthis is a keyword yo
илиkeywords
также приведет к положительному совпадению. Помните об этом :-)/^keyword$/.test(source)
, но 1) еслиkeyword
оно не является константой, вам нужно это сделать,new RegExp('^' + x + '$').test(source)
и 2) прибегнуть к регулярному выражению, чтобы проверить что-то столь же простое, как равенство строк без учета регистра. совсем не очень эффективно.Помните, что оболочка - это операция, специфичная для локали. В зависимости от сценария вы можете принять это во внимание. Например, если вы сравниваете имена двух людей, вы можете рассмотреть локаль, но если вы сравниваете сгенерированные машиной значения, такие как UUID, то вы можете этого не делать. Вот почему я использую следующую функцию в моей библиотеке утилит (обратите внимание, что проверка типа не включена по соображениям производительности).
источник
compareStrings("", "")
дастfalse
несмотря на то, что строки равны.true
для меня. Возможно, это ошибка вашего браузера?Недавно я создал микробиблиотеку, в которой есть помощники для строк без учета регистра: https://github.com/nickuraltsev/ignore-case . (Используется
toUpperCase
внутри.)источник
если вас беспокоит направление неравенства (возможно, вы хотите отсортировать список), вам, скорее всего, нужно выполнить преобразование регистра, и, поскольку в юникоде больше строчных символов, чем в верхнем, toLowerCase, вероятно, является лучшим преобразованием для использования.
Javascript, кажется, использует локаль "C" для сравнения строк, поэтому результирующий порядок будет уродливым, если строки содержат буквы, отличные от ASCII. с этим мало что можно сделать, не проводя гораздо более детального осмотра строк.
источник
Предположим, мы хотим найти строковую переменную
needle
в строковой переменнойhaystack
. Есть три ошибки:string.toUpperCase
иstring.toLowerCase
. Используйте регулярное выражение, которое игнорирует регистр. Например,var needleRegExp = new RegExp(needle, "i");
послеneedleRegExp.test(haystack)
.needle
. Будьте осторожны, чтобы вneedle
регулярных выражениях не было специальных символов . Побег это, используяneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
.needle
иhaystack
, просто игнорируя регистр, обязательно добавьте"^"
в начале и"$"
в конце конструктор вашего регулярного выражения.Принимая во внимание пункты (1) и (2), примером будет:
источник
new RegExp(...)
часть в строке 3 со следующим:new RegExp("^" + needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") + "$", "i");
. Это гарантирует отсутствие других символов до или после строки поискаneedle
.Существует два способа сравнения без учета регистра:
===
). Как строгий оператор относится к операндам, читая материал по адресу: http://www.thesstech.com/javascript/relational-logical-operatorsИспользуйте строковый метод поиска для поиска без учета регистра. Читайте о поиске и других строковых методах по адресу: http://www.thesstech.com/pattern-matching-using-string-methods
источник
Здесь много ответов, но мне нравится добавлять решение, основанное на расширении библиотеки String:
Таким образом, вы можете использовать его так же, как в Java!
Пример:
Выход будет:
источник
Используйте RegEx для совпадения строк или сравнения.
В JavaScript вы можете использовать
match()
для сравнения строк, не забудьте поставитьi
в RegEx.Пример:
источник
matchString.match(/^test$/i)
.matchString.match(/x/i)
работать? Если нет, что будет работать?Даже на этот вопрос уже ответили. У меня другой подход к использованию RegExp и match, чтобы игнорировать регистр символов. Пожалуйста, смотрите мою ссылку https://jsfiddle.net/marchdave/7v8bd7dq/27/
источник
источник
Если обе строки имеют одну и ту же известную локаль, вы можете использовать
Intl.Collator
объект следующим образом:Очевидно, что вы можете кэшировать
Collator
для повышения эффективности.Преимущества этого подхода состоят в том, что он должен быть намного быстрее, чем использование RegExps, и основан на чрезвычайно настраиваемом (см. Описание
locales
иoptions
параметры конструктора в статье выше) готовом к использованию сборщике.источник
accent
, который сохраняет его без учета регистра, но обрабатываетa
иá
как отдельные символы. Такbase
илиaccent
может быть уместно в зависимости от конкретных потребностей.Я написал расширение. очень тривиально
источник
String#isEqual
илиObject#isEqual
изначально все ваши страницы будут вести себя по-разному и могут сделать странные вещи, если спецификация не совсем соответствует вашей.Как насчет НЕ выбрасывать исключения и НЕ использовать медленное регулярное выражение?
Приведенный выше фрагмент предполагает, что вы не хотите совпадать, если строка имеет значение null или не определена.
Если вы хотите сопоставить ноль / неопределенное, то:
Если по какой-то причине вы заботитесь о неопределенности против нуля:
источник
str1 == str2 || ...
Поскольку ни один ответ явно не предоставил простой фрагмент кода для использования
RegExp
, вот моя попытка:У этого есть несколько преимуществ:
undefined
например, может привести к аварийному завершению выражения типаstr1.toUpperCase()
).RegExp
строки.источник
Это улучшенная версия из этого ответа .
Использование и тесты:
Показать фрагмент кода
источник
Преобразуйте оба в нижний (только один раз по соображениям производительности) и сравните их с троичным оператором в одну строку:
источник
Если вы знаете, что имеете дело с
ascii
текстом, вы можете просто использовать сравнение смещения символов в верхнем и нижнем регистре.Просто убедитесь, что строка вашей «идеальной» строки (с которой вы хотите сопоставить) строчная:
источник
Мне нравится этот быстрый вариант стенографии -
Быстрая обработка и делает то, для чего она предназначена.
источник
Эта
javascript
библиотека, кажется, обеспечивает много строковых операций. Это очень удобно использоватьКак установить
Импортировать
Строка сравнения Ignorecase
источник