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;
假设我们想在stringvariableshaystack
findstringvariablesneedle
。 有三个陷阱:
- 国际化的应用程序应该避免
string.toUpperCase
和string.toLowerCase
。 使用正则expression式来代替大小写。 例如,var needleRegExp = new RegExp(needle, "i");
接着needleRegExp.test(haystack)
。 - 一般来说,你可能不知道
needle
的价值。 注意needle
不包含任何正则expression式的特殊字符 。 使用needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
。 - 在其他情况下,如果要精确匹配
needle
和haystack
,只是忽略大小写,请确保在开始处添加"^"
,在正则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);
有两种不区分大小写的比较方法:
-
将string转换为大写,然后使用严格运算符(
===
)比较它们。 如何严格的操作符对待操作数阅读: http : //www.thesstech.com/javascript/relational-logical-operators -
使用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 ); } }