Я пытаюсь получить поиск без учета регистра с двумя строками в JavaScript.
Обычно это будет так:
var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);
/i
Флаг будет для регистра.
Но мне нужно искать вторую строку; без флага работает отлично
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);
Если я добавлю /i
флаг в приведенный выше пример, он будет искать строку поиска, а не то, что находится в переменной «строка поиска» (следующий пример не работает):
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);
Как мне этого добиться?
источник
string.match(/best/i);
.match
для логического сравнения. Он ищет за пределами первого результата. Вы должны остановиться после первого матча, который.test
или.search
делать. Проверьте производительность здесь .toLowerCase
скорее всего, не пройдёт тест Турции ( moserware.com/2008/02/does-your-code-pass-turkey-test.html ) и подобные проблемы с конверсией. Я не уверен, какReGex
справится с этим, но если бы мне пришлось угадывать, я бы сказал лучше.var text = "best"; var exp = new RegExp(test, "i");
, Это так же, как/best/i
.замещать
с участием
источник
s = 'a[b'; r = new RegExp(s)
приводит к синтаксической ошибке (неопределенный класс символов)Если вы просто ищете строку, а не более сложное регулярное выражение, вы можете использовать
indexOf()
- но не забудьте сначала сделать строчные буквы для обеих строк, потому что ониindexOf()
чувствительны к регистру:Или в одной строке:
источник
Предположим, мы хотим найти строковую переменную
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), примером будет:
источник
ES6 +:
includes()
возвращает,true
еслиsearchString
появляется в одной или нескольких позициях илиfalse
иным образом.источник
Если вас беспокоит случай «неопределенного класса символов», было бы полезно удалить все не алфавитно-цифровые символы:
источник
Мне нравится ответ @ CHR15TO, в отличие от других ответов, которые я видел на других похожих вопросах, этот ответ на самом деле показывает, как правильно экранировать предоставленную пользователем строку поиска (вместо того, чтобы говорить, что это будет необходимо, не показывая, как).
Тем не менее, это все еще довольно неуклюже, и, возможно, относительно медленнее. Так почему бы не найти конкретное решение того, что обычно является общим требованием для кодировщиков? (А почему бы не включить его в ES6 API?)
Мой ответ [ https://stackoverflow.com/a/38290557/887092] на похожий вопрос позволяет следующее:
источник
Есть два способа сравнения без учета регистра:
Преобразуйте строки в верхний регистр, а затем сравните их, используя строгий оператор (
===
). Как строгий оператор относится к операндам, читая материал по адресу: http://www.thesstech.com/javascript/relational-logical-operatorsСопоставление с шаблоном с использованием строковых методов:
Используйте строковый метод поиска для поиска без учета регистра. Читайте о поиске и других строковых методах по адресу: http://www.thesstech.com/pattern-matching-using-string-methods
источник
Я делаю это часто и использую простой 5-строчный прототип, который принимает varargs. Это быстро и работает везде .
источник
Вы можете сделать все строчными:
источник
Я заметил, что если пользователь вводит строку текста, но оставляет ввод без выбора каких-либо параметров автозаполнения, никакие значения не устанавливаются в скрытом вводе, даже если строка совпадает с единицей в массиве. Итак, с помощью других ответов я сделал это:
источник