288

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

我怎样才能做到这一点?

4

12 回答 12

387

是的,使用.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');
}
于 2008-10-07T09:16:21.230 回答
192

代替

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

var result= string.search(new RegExp(searchstring, "i"));
于 2008-10-07T09:41:00.790 回答
41

如果您只是搜索字符串而不是更复杂的正则表达式,则可以使用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;
于 2008-10-07T13:16:05.223 回答
24

假设我们要在字符串变量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);
于 2016-07-01T17:56:09.523 回答
6

ES6+:

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


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

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

于 2018-04-28T19:51:32.583 回答
2

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

searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,'');
于 2010-08-24T19:11:57.910 回答
2

我喜欢@CHR15TO 的答案,与我在其他类似问题上看到的其他答案不同,该答案实际上显示了如何正确转义用户提供的搜索字符串(而不是说有必要而不显示如何)。

但是,它仍然很笨重,并且可能相对较慢。那么,为什么不针对可能对编码人员的常见要求制定具体的解决方案呢?(为什么不将它包含在 ES6 API BTW 中?)

我对类似问题的回答 [ https://stackoverflow.com/a/38290557/887092]启用了以下功能:

var haystack = 'A. BAIL. Of. Hay.';
var needle = 'bail.';
var index = haystack.naturalIndexOf(needle);
于 2016-07-12T00:51:22.353 回答
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>
    
于 2015-06-23T11:16:03.067 回答
1

经常这样做,并使用一个简单的接受可变参数的 5 行原型。它速度很快,可以在任何地方使用。

myString.containsIgnoreCase('red','orange','yellow')

/**
 * @param {...string} var_strings Strings to search for
 * @return {boolean} true if ANY of the arguments is contained in the string
 */
String.prototype.containsIgnoreCase = function(var_strings) {
  const thisLowerCase = this.toLowerCase()
  for (let i = 0; i < arguments.length; i++) {
    let needle = arguments[i]
    if (thisLowerCase.indexOf(needle.toLowerCase()) >= 0) {
      return true
    }
  }
  return false
}

/**
 * @param {...string} var_strings Strings to search for
 * @return {boolean} true if ALL of the arguments are contained in the string
 */
String.prototype.containsAllIgnoreCase = function(var_strings) {
  const thisLowerCase = this.toLowerCase()
  for (let i = 0; i < arguments.length; i++) {
    let needle = arguments[i]
    if (thisLowerCase.indexOf(needle.toLowerCase()) === -1) {
      return false
    }
  }
  return true
}

// Unit test

let content = `
FIRST SECOND
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
FOO BAR
`

let data = [
  'foo',
  'Foo',
  'foobar',
  'barfoo',
  'first',
  'second'
]

let result
data.forEach(item => {
  console.log('Searching for', item)
  result = content.containsIgnoreCase(item)
  console.log(result ? 'Found' : 'Not Found')
})

console.log('Searching for', 'x, y, foo')
result = content.containsIgnoreCase('x', 'y', 'foo');
console.log(result ? 'Found' : 'Not Found')

console.log('Searching for all', 'foo, bar, foobar')
result = content.containsAllIgnoreCase('foo', 'bar', 'foobar');
console.log(result ? 'Found' : 'Not Found')

console.log('Searching for all', 'foo, bar')
result = content.containsAllIgnoreCase('foo', 'bar');
console.log(result ? 'Found' : 'Not Found')

于 2018-08-11T13:05:28.813 回答
0

您可以将所有内容设为小写:

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= (string.toLowerCase()).search((searchstring.toLowerCase()));
alert(result);
于 2019-01-29T07:46:13.780 回答
0

我正在尝试区分大小写的字符串搜索,我尝试了

 var result = string.toLowerCase().match(searchstring) 

并且

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

但我做了一些小修改,这对我有用

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

这将是小写,大写或组合

于 2021-04-21T12:08:35.710 回答
-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 );

            }
        } 
于 2014-12-03T12:48:07.810 回答