Содержит регистронезависимый

У меня есть следующее:

if (referrer.indexOf("Ral") == -1) { ... }

Мне нравится делать Ral нечувствительный к регистру, чтобы он мог быть Ral, Ral и т.д. и по-прежнему соответствовать.

Есть ли способ сказать, что Ral должен быть нечувствителен к регистру?

Ответ 1

Добавьте .toLowerCase() после referrer. Этот метод превращает строку в строчную строку. Затем используйте .indexOf(), используя ral вместо ral.

if (referrer.toLowerCase().indexOf("ral") === -1) { 

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

if (!/Ral/i.test(referrer)) {
   //    ^i = Ignore case flag for RegExp

Ответ 2

Другие варианты - использовать метод поиска следующим образом:

if (referrer.search(new RegExp("Ral", "i")) == -1) { ...

Он выглядит более элегантным, чем преобразование всей строки в нижний регистр, и это может быть более эффективным.
С toLowerCase() код имеет два прохода над строкой, один проход находится на всей строке, чтобы преобразовать его в нижний регистр, а другой - искать нужный индекс.
С RegExp код имеет один проход над строкой, которая, по-видимому, соответствует желаемому индексу.

Поэтому на длинных строках я рекомендую использовать версию RegExp (я полагаю, что в коротких строках эта эффективность возникает из-за создания объекта RegExp)

Ответ 3

Используйте RegExp:

if (!/ral/i.test(referrer)) {
    ...
}

Или используйте .toLowerCase():

if (referrer.toLowerCase().indexOf("ral") == -1)

Ответ 4

Здесь есть несколько подходов.

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

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) { ...

Ответ 5

С ES2016 вы также можете использовать немного лучше/проще/более элегантный метод:

if (referrer.includes("Ral")) { ... }

или же

if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }

Вот некоторые сравнения .indexOf() и .includes(): https://dev.to/adroitcoder/includes-vs-indexof-in-javascript

Ответ 6

if (referrer.toUpperCase().indexOf("RAL") == -1) { ...

Ответ 7

Это 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", что sooooo long
  • "естественный" - хороший кандидат, потому что сравнения случаев, чувствительных к регистру, не являются естественными для людей в первую очередь.

Почему бы...:

  • toLowerCase() - потенциальные повторные вызовы toLowerCase в одной строке.
  • RegExp - неудобно искать с переменной. Даже объекту RegExp неловко приходится избегать символов

Ответ 8

Для лучшего поиска используйте следующий код,

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() ) );

В первом предупреждении() JavaScript вернул "-1" - другими словами, indexOf() не нашел совпадения: это просто потому, что "JavaScript" имеет строчную букву в первой строке и правильно заглавную в второй. Чтобы выполнить поиск без учета регистра с помощью indexOf(), вы можете сделать обе строки строчными или строчными буквами. Это означает, что, как и во втором предупреждении(), JavaScript будет проверять только наличие строки, которую вы ищете, игнорирование капитализации.

Справочник, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm

Ответ 9

Если referrer является массивом, вы можете использовать findIndex()

 if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}

Ответ 10

Вот мой прием:

Script

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 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>

Codepen

Ответ 11

Пример для любого языка:

'My name is Хведор'.toLocaleLowerCase().includes('ХвЕдОр'.toLocaleLowerCase())

Ответ 12

Вы можете попробовать это

str = "Wow its so COOL"
searchStr = "CoOl"

console.log(str.toLowerCase().includes(searchStr.toLowerCase()))