JavaScript: поиск без учета регистра

Я пытаюсь получить поиск без учета регистра с двумя строками в 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);

Как мне этого добиться?

вопрос задан 7.10.2008
Chris Boesing
3519 репутация

10 ответов


  • 347 рейтинг

    Да, используйте .match, а не .search. Результат вызова .match вернет фактическую строку, которая была сопоставлена ​​сама, но она все еще может использоваться как логическое значение.

    var string = "Stackoverflow is the BEST";
    var result = string.match(/best/i);
    // result == 'BEST';
    
    if (result){
        alert('Matched');
    }
    

    Использование такого регулярного выражения, вероятно, является самым аккуратным и очевидным способом сделать это в JavaScript, но имейте в виду, что является регулярным выражением и, таким образом, может содержать метасимволы регулярных выражений. Если вы хотите взять строку из другого места (например, пользовательский ввод) или если вам нужно избежать экранирования большого количества метасимволов, то вам, вероятно, лучше всего использовать indexOf, например:

    matchString = 'best';
    // If the match string is coming from user input you could do
    // matchString = userInput.toLowerCase() here.
    
    if (string.toLowerCase().indexOf(matchString) != -1){
        alert('Matched');
    }
    
    ответ дан Dan, с репутацией 41934, 7.10.2008
  • 152 рейтинг

    Заменить

    var result= string.search(/searchstring/i);
    

    с

    var result= string.search(new RegExp(searchstring, "i"));
    
    ответ дан Sergey Ilinsky, с репутацией 25480, 7.10.2008
  • 36 рейтинг

    Если вы просто ищете строку, а не более сложное регулярное выражение, вы можете использовать indexOf() - но не забывайте вначале ставить обе строки в нижнем регистре, потому что indexOf() чувствителен к регистру:

    var string="Stackoverflow is the BEST"; 
    var searchstring="best";
    
    // lowercase both strings
    var lcString=string.toLowerCase();
    var lcSearchString=searchstring.toLowerCase();
    
    var result = lcString.indexOf(lcSearchString)>=0;
    alert(result);
    

    или в одну строку:

    var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0;
    
    ответ дан Odilon Redo, с репутацией 501, 7.10.2008
  • 17 рейтинг

    Предположим, мы хотим найти строковую переменную needle в строковой переменной haystack. Есть три ошибки:

    1. Интернационализированных приложений следует избегать string.toUpperCase и string.toLowerCase. Используйте регулярное выражение, которое игнорирует регистр. Например, var needleRegExp = new RegExp(needle, "i"); и needleRegExp.test(haystack).
    2. В общем случае вы можете не знать значение needle. Будьте осторожны, чтобы needle не содержал регулярных выражений специальных символов . Побег из них, используя needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");.
    3. В других случаях, если вы хотите точно сопоставить needle и haystack, просто игнорируя регистр, обязательно добавьте "^" в начале и "$" в конце вашего конструктора регулярного выражения.

    Принимая во внимание пункты (1) и (2), пример будет:

    var haystack = "A. BAIL. Of. Hay.";
    var needle = "bail.";
    var needleRegExp = new RegExp(needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), "i");
    var result = needleRegExp.test(haystack);
    alert(result);
    
    ответ дан Chris Chute, с репутацией 561, 1.07.2016
  • 2 рейтинг

    Мне нравится ответ @ CHR15TO, в отличие от других ответов, которые я видел на других похожих вопросах, этот ответ фактически показывает, как правильно экранировать строку поиска, предоставленную пользователем (вместо того, чтобы говорить, что это будет необходимо, не показывая, как).

    Однако, это все еще довольно неуклюже, и, возможно, относительно медленнее. Так почему бы не найти конкретное решение того, что обычно является общим требованием для кодировщиков? (А почему бы не включить его в ES6 API BTW? )

    Мой ответ [ https: // stackoverflow. com / a / 38290557/887092] по схожему вопросу позволяет следующее:

    var haystack = 'A. BAIL. Of. Hay.';
    var needle = 'bail.';
    var index = haystack.naturalIndexOf(needle);
    
    ответ дан Todd, с репутацией 9860, 12.07.2016
  • 2 рейтинг

    ES6 +

    let string="Stackoverflow is the BEST";
    let searchstring="best";
    
    
    let found = string.toLowerCase()
                      .includes(searchstring.toLowerCase());
    

    include () возвращает true, если searchString появляется в одной или нескольких позициях, в противном случае возвращает false

    ответ дан Andrey, с репутацией 16977, 28.04.2018
  • 1 рейтинг

    Я делаю это часто и использую простой 5-строчный прототип, который принимает переменные. Это быстрый и работает везде .

    myString.containsIgnoreCase('red','orange','yellow')
    
    /**
     * @param {...string} var_strings Strings to search for
     * @return {boolean} true if ANY of the arguments is contained in the string
     */
    String.prototype.containsIgnoreCase = function(var_strings) {
      const thisLowerCase = this.toLowerCase()
      for (let i = 0; i < arguments.length; i++) {
        let needle = arguments[i]
        if (thisLowerCase.indexOf(needle.toLowerCase()) >= 0) {
          return true
        }
      }
      return false
    }
    
    /**
     * @param {...string} var_strings Strings to search for
     * @return {boolean} true if ALL of the arguments are contained in the string
     */
    String.prototype.containsAllIgnoreCase = function(var_strings) {
      const thisLowerCase = this.toLowerCase()
      for (let i = 0; i < arguments.length; i++) {
        let needle = arguments[i]
        if (thisLowerCase.indexOf(needle.toLowerCase()) === -1) {
          return false
        }
      }
      return true
    }
    
    // Unit test
    
    let content = `
    FIRST SECOND
    "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
    "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
    "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
    "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
    "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
    "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
    FOO BAR
    `
    
    let data = [
      'foo',
      'Foo',
      'foobar',
      'barfoo',
      'first',
      'second'
    ]
    
    let result
    data.forEach(item => {
      console.log('Searching for', item)
      result = content.containsIgnoreCase(item)
      console.log(result ? 'Found' : 'Not Found')
    })
    
    console.log('Searching for', 'x, y, foo')
    result = content.containsIgnoreCase('x', 'y', 'foo');
    console.log(result ? 'Found' : 'Not Found')
    
    console.log('Searching for all', 'foo, bar, foobar')
    result = content.containsAllIgnoreCase('foo', 'bar', 'foobar');
    console.log(result ? 'Found' : 'Not Found')
    
    console.log('Searching for all', 'foo, bar')
    result = content.containsAllIgnoreCase('foo', 'bar');
    console.log(result ? 'Found' : 'Not Found')
    ответ дан Steven Spungin, с репутацией 5632, 11.08.2018
  • 1 рейтинг

    Если вас беспокоит случай «неопределенного класса символов», было бы полезно удалить все не алфавитно-цифровые символы:

    searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,'');
    ответ дан dsomnus, с репутацией 768, 24.08.2010
  • 1 рейтинг

    Существует два способа сравнения без учета регистра:

    1. Преобразовать строки в верхний регистр, а затем сравнить их с помощью оператора строгого управления (===). Как строгий оператор относится к операндам, читающим материал по адресу: http: // www. thesstech. com / javascript / реляционные логические операторы

    2. Сопоставление шаблонов с использованием строковых методов:

      Используйте строковый метод поиска для поиска без учета регистра. Читайте о поиске и других строковых методах по адресу: http: // www. thesstech. com / pattern-match-using-string-method

      
        
          
      
      
    ответ дан Sohail Arif, с репутацией 172, 23.06.2015
  • -1 рейтинг

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

    var $local_source = [{
            value: 1,
            label: "c++"
        }, {
            value: 2,
            label: "java"
        }, {
            value: 3,
            label: "php"
        }, {
            value: 4,
            label: "coldfusion"
        }, {
            value: 5,
            label: "javascript"
        }, {
            value: 6,
            label: "asp"
        }, {
            value: 7,
            label: "ruby"
        }];
        $('#search-fld').autocomplete({
            source: $local_source,
            select: function (event, ui) {
                $("#search-fld").val(ui.item.label); // display the selected text
                $("#search-fldID").val(ui.item.value); // save selected id to hidden input
                return false;
            },
            change: function( event, ui ) {
    
                var isInArray = false;
    
                $local_source.forEach(function(element, index){
    
                    if ($("#search-fld").val().toUpperCase() == element.label.toUpperCase()) {
                        isInArray = true;
                        $("#search-fld").val(element.label); // display the selected text
                        $("#search-fldID").val(element.value); // save selected id to hidden input
                        console.log('inarray: '+isInArray+' label: '+element.label+' value: '+element.value);
                    };
    
                });
    
                if(!isInArray){
    
                    $("#search-fld").val(''); // display the selected text
                    $( "#search-fldID" ).val( ui.item? ui.item.value : 0 );
    
                }
            } 
    
    ответ дан Ago, с репутацией 19, 3.12.2014