不区分大小写的搜索

Chr*_*ing 268 javascript search case-insensitive string-comparison

我正在尝试使用JavaScript中的两个字符串进行不区分大小写的搜索.

通常它会是这样的:

var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);
Run Code Online (Sandbox Code Playgroud)

/i标志将不区分大小写.

但我需要搜索第二个字符串; 没有旗帜它完美无缺:

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);
Run Code Online (Sandbox Code Playgroud)

如果我将/i标志添加到上面的示例中,它将搜索searchstring而不是变量"searchstring"中的内容(下一个示例不起作用):

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Dan*_*Dan 370

是的,使用.match,而不是.search..match调用的结果将返回与其自身匹配的实际字符串,但它仍可用作布尔值.

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

if (result){
    alert('Matched');
}
Run Code Online (Sandbox Code Playgroud)

使用这样的正则表达式可能是在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');
}
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,您如何在第一个示例中将"best"转换为变量?```string.match(/最佳/ I);``` (9认同)
  • 为什么要使用`.match`进行布尔比较.它搜索超出第一个结果.你需要在第一场比赛后停止`.test`或`.search`.检查性能[这里](https://jsperf.com/exec-vs-match-vs-test-vs-search/5). (5认同)
  • @DougMolineux 您可以使用 RegExp 对象构造函数。`var text = "最佳"; var exp = new RegExp(test, "i");`. 这与`/best/i` 相同。 (5认同)

Ser*_*sky 166

更换

var result= string.search(/searchstring/i);
Run Code Online (Sandbox Code Playgroud)

var result= string.search(new RegExp(searchstring, "i"));
Run Code Online (Sandbox Code Playgroud)

  • 丹,我怀疑我的回答值得你.我尝试通过纠正他对JavaScript的不当使用来帮助ChrisBo,即:var result = string.search(/ searchstring/i); 一个适当的,其中变量searchstring按照他的意图使用. (35认同)
  • 丹是对的(尽管他可能会说"*没有*措施"):`s ='a [b'; r = new RegExp(s)`导致语法错误(未终止的字符类) (8认同)
  • 这是一个相当混乱的方式,因为它需要采取措施来防止意外的正则表达式元字符. (7认同)

小智 37

如果您只是搜索字符串而不是更复杂的正则表达式,则可以使用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);
Run Code Online (Sandbox Code Playgroud)

或者在一行中:

var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0;
Run Code Online (Sandbox Code Playgroud)


Chr*_*ute 22

假设我们想在字符串变量needle中找到字符串变量haystack.有三个问题:

  1. 国际化的应用程序应该避免string.toUpperCasestring.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);
Run Code Online (Sandbox Code Playgroud)


And*_*rey 5

ES6+:

let string="Stackoverflow is the BEST";
let searchstring="best";


let found = string.toLowerCase()
                  .includes(searchstring.toLowerCase());
Run Code Online (Sandbox Code Playgroud)

includes()返回true如果searchString在一个或多个位置或出现false其他。