Содержит регистронезависимый - PullRequest
356 голосов
/ 25 января 2012

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

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

Что мне нравится делать, так это делать Ral нечувствительным к регистру, чтобы оно могло быть RAl, rAl и т. Д. И при этом совпадать.

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

Ответы [ 10 ]

538 голосов
/ 25 января 2012

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

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

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

if (!/Ral/i.test(referrer)) {
   //    ^i = Ignore case flag for RegExp
88 голосов
/ 18 февраля 2013

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

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

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

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

19 голосов
/ 25 января 2012

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

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

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

if (referrer.toLowerCase().indexOf("ral") == -1)
11 голосов
/ 22 июня 2018

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

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

или

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

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

10 голосов
/ 25 января 2012

Здесь есть пара подходов.

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

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) { ...
4 голосов
/ 25 января 2012
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...
2 голосов
/ 10 июля 2016

Это 2016 год, и нет четкого способа, как это сделать?Я надеялся на некоторый copypasta.Я пойду.

Замечания по проектированию: я хотел минимизировать использование памяти и, следовательно, повысить скорость - чтобы не было копирования / изменения строк.Я предполагаю, что 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
  • "natural" - хороший кандидат, потому что сравнения по умолчанию с учетом регистра не являются естественнымидля людей в первую очередь.

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

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

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

 if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}
1 голос
/ 02 октября 2012

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

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 будет проверять только наличие строки, которую вы ищете, заглавные буквы игнорируются.

Reference, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm

0 голосов
/ 08 апреля 2017

Вот мой дубль:

Сценарий :

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>

Codepen

...