Содержит регистронезависимый
У меня есть следующее:
if (referrer.indexOf("Ral") == -1) { ... }
Что мне нравится делать, так это делать Ral
без учета регистра, так что это может быть RAl
, rAl
и т.д. и до сих пор совпадают.
Есть ли способ сказать, что Ral
должен быть без учета регистра?
14 ответов
Добавлять .toLowerCase()
после referrer
, Этот метод превращает строку в строчную строку. Затем используйте .indexOf()
с помощью ral
вместо Ral
,
if (referrer.toLowerCase().indexOf("ral") === -1) {
Этого также можно добиться с помощью регулярного выражения (особенно полезно, когда вы хотите проверить динамические шаблоны):
if (!/Ral/i.test(referrer)) {
// ^i = Ignore case flag for RegExp
Другой вариант - использовать метод поиска следующим образом:
if (referrer.search(new RegExp("Ral", "i")) == -1) { ...
Это выглядит более элегантно, чем преобразование всей строки в нижний регистр, и это может быть более эффективным.
С toLowerCase()
код имеет два прохода над строкой, один проход по всей строке, чтобы преобразовать ее в нижний регистр, а другой - поиск нужного индекса.
С RegExp
код имеет один проход по строке, которая выглядит так, чтобы соответствовать желаемому индексу.
Поэтому на длинных струнах я рекомендую использовать RegExp
версия (я думаю, что на коротких строках эта эффективность достигается за счет создания RegExp
возражаю хотя)
С ES2016 вы также можете использовать немного лучше / проще / более элегантный метод:
if (referrer.includes("Ral")) { ... }
или же
if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }
Вот некоторое сравнение .indexOf()
а также .includes()
: https://dev.to/adroitcoder/includes-vs-indexof-in-javascript
Используйте RegExp:
if (!/ral/i.test(referrer)) {
...
}
Или используйте .toLowerCase()
:
if (referrer.toLowerCase().indexOf("ral") == -1)
Здесь есть пара подходов.
Если вы хотите выполнить проверку без учета регистра только для этого экземпляра, сделайте что-то вроде следующего.
if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) == -1) {
...
Кроме того, если вы выполняете эту проверку регулярно, вы можете добавить новый indexOf()
подобный метод String
, но сделать это без учета регистра.
String.prototype.indexOfInsensitive = function (s, b) {
return this.toLowerCase().indexOf(s.toLowerCase(), b);
}
// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...
Вы можете попробовать это
str = "Wow its so COOL"
searchStr = "CoOl"
console.log(str.toLowerCase().includes(searchStr.toLowerCase()))
Вот параметры согласно ES6 в порядке убывания производительности.
Включает
if (referrer.toLowerCase().includes("Ral".toLowerCase())) { ... }
IndexOf (иногда дает аналогичные или лучшие результаты, чем включает)
if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) !== -1) { ... }
Матч
if (referrer.match(new RegExp("Ral", 'i'))) { ... }
Результаты теста: https://jsben.ch/IBbnl
Пример для любого языка:
'My name is Хведор'.toLocaleLowerCase().includes('ХвЕдОр'.toLocaleLowerCase())
Если referrer
это массив, вы можете использовать findIndex()
if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}
Это 2016 год, и нет четкого способа, как это сделать? Я надеялся на некоторую копию пасты. Я пойду.
Замечания по дизайну: я хотел минимизировать использование памяти и, следовательно, улучшить скорость - чтобы не было копирования / изменения строк. Я предполагаю, что V8 (и другие двигатели) могут оптимизировать эту функцию.
//TODO: Performance testing
String.prototype.naturalIndexOf = function(needle) {
//TODO: guard conditions here
var haystack = this; //You can replace `haystack` for `this` below but I wan't to make the algorithm more readable for the answer
var needleIndex = 0;
var foundAt = 0;
for (var haystackIndex = 0; haystackIndex < haystack.length; haystackIndex++) {
var needleCode = needle.charCodeAt(needleIndex);
if (needleCode >= 65 && needleCode <= 90) needleCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser
var haystackCode = haystack.charCodeAt(haystackIndex);
if (haystackCode >= 65 && haystackCode <= 90) haystackCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser
//TODO: code to detect unicode characters and fallback to toLowerCase - when > 128?
//if (needleCode > 128 || haystackCode > 128) return haystack.toLocaleLowerCase().indexOf(needle.toLocaleLowerCase();
if (haystackCode !== needleCode)
{
foundAt = haystackIndex;
needleIndex = 0; //Start again
}
else
needleIndex++;
if (needleIndex == needle.length)
return foundAt;
}
return -1;
}
Моя причина для имени:
- Должен иметь IndexOf в названии
- Не добавлять суффикс - Of относится к следующему параметру
- Не используйте caseInsensitive, который оооочень долго
- "Natural" - хороший кандидат, потому что сравнение с учетом регистра по умолчанию не является естественным для человека.
Почему бы и нет...:
toLowerCase()
- потенциальные повторные вызовы toLowerCase по той же строке.RegExp
- неловко искать с переменной. Даже объекту RegExp неудобно экранировать символы
Для лучшего поиска используйте следующий код,
var myFav = "javascript";
var theList = "VB.NET, C#, PHP, Python, JavaScript, and Ruby";
// Check for matches with the plain vanilla indexOf() method:
alert( theList.indexOf( myFav ) );
// Now check for matches in lower-cased strings:
alert( theList.toLowerCase().indexOf( myFav.toLowerCase() ) );
В первом alert() JavaScript возвращал "-1" - другими словами, indexOf() не нашел соответствия: это просто потому, что "JavaScript" находится в нижнем регистре в первой строке и правильно прописывается во второй. Для выполнения поиска без учета регистра с помощью indexOf () вы можете сделать обе строки прописными или строчными. Это означает, что, как и во втором alert(), JavaScript будет проверять только наличие строки, которую вы ищете, заглавные буквы игнорируются.
Ссылка, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm
Вот мое мнение:
Сценарий:
var originalText = $("#textContainer").html()
$("#search").on('keyup', function () {
$("#textContainer").html(originalText)
var text = $("#textContainer").html()
var val = $("#search").val()
if(val=="") return;
var matches = text.split(val)
for(var i=0;i<matches.length-1;i++) {
var ind = matches[i].indexOf(val)
var len = val.length
matches[i] = matches[i] + "<span class='selected'>" + val + "</span>"
}
$("#textContainer").html(matches.join(""))
HTML:
<input type="text" id="search">
<div id="textContainer">
lorem ipsum is simply dummy text of the printing and typesetting industry. lorem ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of letraset sheets containing lorem ipsum passages, and more recently with desktop publishing software like Aldus pagemaker including versions of lorem ipsum.</div>