У меня есть следующее:
if (referrer.indexOf("Ral") == -1) { ... }
То , что я хотел бы сделать , это Ral
чувствительно к регистру, так что это может быть RAl
, rAl
и т.д. , и по- прежнему совпадают.
Есть ли способ сказать, что Ral
он должен быть без учета регистра?
RegExp
непосредственного пользовательского ввода. Например, пользователь может войти,*
и в конструктор будет выдана ошибкаRegExp
. Принятое решение не имеет этой проблемы.Ответы:
Добавить
.toLowerCase()
послеreferrer
. Этот метод превращает строку в строчную строку. Затем.indexOf()
используйтеral
вместоRal
.Этого также можно добиться с помощью регулярного выражения (особенно полезно, когда вы хотите проверить динамические шаблоны):
источник
toLocaleLowerCase()
( ref ).search
:var index = referrer.search(/Ral/i);
Другой вариант - использовать метод поиска следующим образом:
Это выглядит более элегантно, чем преобразование всей строки в нижний регистр, и это может быть более эффективным.
В
toLowerCase()
коде есть два прохода над строкой, один проход на всю строку, чтобы преобразовать ее в нижний регистр, а другой - поиск нужного индекса.С
RegExp
кодом есть один проход по строке, которая выглядит так, чтобы соответствовать желаемому индексу.Поэтому на длинных строках я рекомендую использовать
RegExp
версию (я думаю, что на коротких строках эта эффективность достигается за счет созданияRegExp
объекта)источник
Используйте RegExp:
Или используйте
.toLowerCase()
:источник
Начиная с ES2016, вы также можете использовать метод немного лучше / проще / элегантнее (с учетом регистра):
или (без учета регистра):
Вот некоторые сравнения
.indexOf()
и.includes()
: https://dev.to/adroitcoder/includes-vs-indexof-in-javascriptисточник
includes
является чувствительны к регистру в Chrome: попробуйте'fooBar'.includes('bar')
==>false
Здесь есть пара подходов.
Если вы хотите выполнить проверку без учета регистра только для этого экземпляра, выполните что-то вроде следующего.
В качестве альтернативы, если вы выполняете эту проверку регулярно, вы можете добавить новый
indexOf()
похожий методString
, но сделать его без учета регистра.источник
defineProperty
, я предлагаюObject.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});
. Два обновления: явное преобразование строк с использованием(s+'')
и не перечислимый в цикле (for(var i in '') ...
не отображаетсяindexOfInsensitive
.источник
Вы можете попробовать это
источник
Пример для любого языка:
источник
Это 2016 год, и нет четкого способа, как это сделать? Я надеялся на некоторый copypasta. Я пойду.
Замечания по дизайну: я хотел минимизировать использование памяти и, следовательно, улучшить скорость - чтобы не было копирования / изменения строк. Я предполагаю, что V8 (и другие двигатели) могут оптимизировать эту функцию.
Моя причина для имени:
Почему бы нет...:
toLowerCase()
- потенциальные повторные вызовы toLowerCase по той же строке.RegExp
Неловко искать с переменной. Даже объект RegExp неудобно экранировать символыисточник
Для лучшего поиска используйте следующий код,
В первом alert () JavaScript возвращал «-1» - другими словами, indexOf () не нашел соответствия: это просто потому, что «JavaScript» находится в нижнем регистре в первой строке и правильно прописывается во второй. Для выполнения поиска без учета регистра с помощью indexOf () вы можете сделать обе строки прописными или строчными. Это означает, что, как и во втором alert (), JavaScript будет проверять только наличие строки, которую вы ищете, заглавные буквы игнорируются.
Ссылка, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm
источник
Если
referrer
это массив, вы можете использоватьfindIndex()
источник
Вот мой дубль:
Сценарий :
HTML:
Codepen
источник