2008-10-07 2 views
235

Я пытаюсь получить поиск без учета регистра с двумя строками в 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 флаг в приведенном выше примере это будет искать SearchString и не для того, что находится в переменной «SearchString» (следующий пример не работает):

var string="Stackoverflow is the BEST"; 
var searchstring="best"; 
var result= string.search(/searchstring/i); 
alert(result); 

Как я могу это достичь?

ответ

317

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

var string = "Stackoverflow is the BEST"; 
var result = string.match(/best/i); 
// result == 'BEST'; 

if (result){ 
    alert('Matched'); 
} 

Используя регулярное выражение, как это, вероятно, tidiest и самый очевидный способ сделать это в 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'); 
} 
+11

Что делать, если MatchString имеет значение «Бест»? Собственный нечувствительный к регистру поиск все равно должен найти это событие. В вашем случае вам, вероятно, также потребуется вызвать toLowerCase() в поисковом запросе. – 2008-10-07 09:42:48

+0

Я добавил комментарий, чтобы отразить этот факт, спасибо. – Dan 2008-10-07 10:06:43

+7

Извините, как вы можете преобразовать «лучший» в переменную в вашем первом примере? `` `string.match (/ best/i);` `` – 2015-10-23 16:00:52

138

Заменить

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

с

var result= string.search(new RegExp(searchstring, "i")); 
33

Если вы просто ищете строку, а не более сложного регулярного выражения, вы можете использовать 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; 
2

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

searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,'');
-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); 

      } 
     } 
1

Есть два способа для случая нечувствительного сравнения:

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

  2. шаблон согласования, используя строковые методы:

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

    <!doctype html> 
        <html> 
        <head> 
         <script> 
    
         // 1st way 
    
         var a = "apple"; 
         var b = "APPLE"; 
         if (a.toUpperCase() === b.toUpperCase()) { 
          alert("equal"); 
         } 
    
         //2nd way 
    
         var a = " Null and void"; 
         document.write(a.search(/null/i)); 
    
         </script> 
        </head> 
    </html> 
    
14

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

  1. Многоязычные приложения должны избегать string.toUpperCase и string.toLowerCase. Используйте регулярное выражение, которое вместо этого игнорирует случай. Например, var needleRegExp = new RegExp(needle, "i");, а затем needleRegExp.test(haystack).
  2. В общем, вы можете не знать значение needle. Будьте осторожны, чтобы needle не содержал никаких регулярных выражений special characters. Удалите их, используя 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); 
2

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

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

Мой ответ [https://stackoverflow.com/a/38290557/887092] на подобный вопрос позволяет:

var haystack = 'A. BAIL. Of. Hay.'; 
var needle = 'bail.'; 
var index = haystack.naturalIndexOf(needle); 
Смежные вопросы