不区分大小写的搜索

IT技术 javascript search string-comparison case-insensitive
2021-01-20 12:25:34

我正在尝试使用 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);

我怎样才能做到这一点?

6个回答

是的,使用.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');
}
toLowerCase很可能无法通过土耳其测试 ( moserware.com/2008/02/does-your-code-pass-turkey-test.html ) 和类似的案例转换问题。我不确定如何ReGex处理它,但如果我不得不猜测我会说更好。
2021-03-22 12:25:34
为什么要.match用于布尔比较。它搜索超出第一个结果的范围。您需要在第一场比赛之后停止 which .testor .searchdo。在此处检查性能
2021-03-28 12:25:34
@DougMolineux 您可以使用 RegExp 对象构造函数。 var text = "best"; var exp = new RegExp(test, "i");. 这与/best/i.
2021-03-28 12:25:34
抱歉,在第一个示例中,如何将“最佳”转换为变量? string.match(/best/i);
2021-04-10 12:25:34

代替

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

var result= string.search(new RegExp(searchstring, "i"));
丹,我怀疑我的回答值得你-1。我尝试通过纠正他对 JavaScript 的不当使用来帮助 ChrisBo,即: var result= string.search(/searchstring/i); 到一个适当的,其中变量 searchstring 以他想要的方式使用。
2021-03-27 12:25:34
丹是对的(尽管他可能想说“没有措施”): s = 'a[b'; r = new RegExp(s)导致语法错误(未终止的字符类)
2021-03-28 12:25:34
这是一种相当混乱的方法,因为它需要采取措施来防止意外的正则表达式元字符。
2021-04-08 12:25:34

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

假设我们要在字符串变量needle找到字符串变量haystack有三个陷阱:

  1. 国际化的应用程序应该避免string.toUpperCasestring.toLowerCase使用忽略大小写的正则表达式。例如,var needleRegExp = new RegExp(needle, "i");后跟needleRegExp.test(haystack).
  2. 通常,您可能不知道 的值needle注意needle不要包含任何正则表达式的特殊字符使用needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");.
  3. 在其他情况下,如果您想精确匹配needleand 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);

ES6+:

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


let found = string.toLowerCase()
                  .includes(searchstring.toLowerCase());

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