JavaScript:不区分大小写的search

我试图用JavaScript中的两个string进行不区分大小写的search。

通常情况下会是这样的:

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

/i标志将是不区分大小写的。

但是我需要search第二个string; 没有国旗完美的作品:

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

如果我将/i标志添加到上面的示例中,它将searchsearchstring而不searchvariables“searchstring”中的内容(下一个示例不起作用):

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

我怎样才能做到这一点?

是的,使用.match ,而不是.match.match调用的结果将返回自身匹配的实际string,但仍然可以用作布尔值。

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

使用这样的正则expression式可能是在JavaScript中最简单也是最明显的方式,但要记住它一个正则expression式,因此可以包含正则expression式元字符。 如果你想从其他地方(例如,用户input)获取string,或者如果你想避免不必要的转义许多元字符,那么你可能是最好的使用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'); } 

更换

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

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

如果你只是search一个string而不是一个更复杂的正则expression式,你可以使用indexOf() – 但记住要小写两个string,因为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; 

假设我们想在stringvariableshaystackfindstringvariablesneedle 。 有三个陷阱:

  1. 国际化的应用程序应该避免string.toUpperCasestring.toLowerCase 。 使用正则expression式来代替大小写。 例如, var needleRegExp = new RegExp(needle, "i"); 接着needleRegExp.test(haystack)
  2. 一般来说,你可能不知道needle的价值。 注意needle不包含任何正则expression式的特殊字符 。 使用needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  3. 在其他情况下,如果要精确匹配needlehaystack ,只是忽略大小写,请确保在开始处添加"^" ,在正则expression式构造函数的末尾添加"$"

考虑点(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); 

如果您担心“未终止字符类”的情况,删除所有非字母数字字符将会有所帮助:

  searchstring = searchstring.replace(/ [^ a-zA-Z 0-9] + / g,''); 

我喜欢@ CHR15TO的答案,不同于其他类似问题的答案,答案实际上表明如何正确地逃避用户提供的searchstring(而不是说如果没有显示如何是必要的)。

但是,它仍然相当笨重,可能相对较慢。 那么为什么不能有一个特定的解决scheme,可能是编码器的共同要求? (为什么不把它包含在ES6 API中?)

我的答案[ https://stackoverflow.com/a/38290557/887092%5D在一个类似的问题,使以下几点:;

 var haystack = 'A. BAIL. Of. Hay.'; var needle = 'bail.'; var index = haystack.naturalIndexOf(needle); 

有两种不区分大小写的比较方法:

  1. 将string转换为大写,然后使用严格运算符( === )比较它们。 如何严格的操作符对待操作数阅读: http : //www.thesstech.com/javascript/relational-logical-operators

  2. 使用string方法的模式匹配

    使用“search”string方法进行不区分大小写的search。 请阅读http://www.thesstech.com/pattern-matching-using-string-methods了解search和其他string方法;

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

我注意到,如果用户input一个文本string,但没有select任何自动完成选项,则不input任何值,即使该string与数组中的一个一致。 所以,在其他答案的帮助下,我做了这个:

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