【问题标题】:Case-insensitive search不区分大小写的搜索
【发布时间】:2010-09-15 17:12:55
【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: javascript search string-comparison case-insensitive


    【解决方案1】:

    是的,使用.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');
    }
    

    【讨论】:

    • 抱歉,如何在第一个示例中将“最佳”转换为变量? string.match(/best/i);
    • 为什么要使用.match 进行布尔比较。它在第一个结果之外进行搜索。你需要在.test.search 做的第一场比赛后停下来。检查性能here.
    • toLowerCase 很可能无法通过土耳其测试 (moserware.com/2008/02/does-your-code-pass-turkey-test.html) 和类似的大小写转换问题。我不确定ReGex 是如何处理它的,但如果我不得不猜测我会说得更好。
    • @DougMolineux 您可以使用 RegExp 对象构造函数。 var text = "best"; var exp = new RegExp(test, "i");。这与/best/i 相同。
    【解决方案2】:

    替换

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

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

    【讨论】:

    • 这是一个相当混乱的方法,因为它需要采取措施来防止意外的正则表达式元字符。
    • 丹,我怀疑我的回答应该得到你的 -1。我尝试通过纠正他对 JavaScript 的不当使用来帮助 ChrisBo,即: var result= string.search(/searchstring/i);到一个合适的地方,其中变量 searchstring 按他的意图使用。
    • Dan 是对的(尽管他的意思可能是“no 措施”):s = 'a[b'; r = new RegExp(s) 导致语法错误(未终止的字符类)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      1. 国际化应用程序应避免使用string.toUpperCasestring.toLowerCase。改用忽略大小写的正则表达式。例如,var needleRegExp = new RegExp(needle, "i"); 后跟 needleRegExp.test(haystack)
      2. 一般来说,您可能不知道needle 的值。注意needle 不包含任何正则表达式special characters。使用needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 转义这些。
      3. 在其他情况下,如果您想精确匹配needlehaystack,只需忽略大小写,请确保在正则表达式构造函数的开头添加"^",在末尾添加"$"。李>

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

      【讨论】:

        【解决方案5】:

        ES6+:

        let string="Stackoverflow is the BEST";
        let searchstring="best";
        
        
        let found = string.toLowerCase()
                          .includes(searchstring.toLowerCase());
        

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

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

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

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

            【讨论】:

              【解决方案8】:

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

              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>
                

              【讨论】:

                【解决方案9】:

                经常这样做,并使用一个接受可变参数的简单 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')

                【讨论】:

                  【解决方案10】:

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

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

                  【讨论】:

                    【解决方案11】:

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

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

                    还有

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

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

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

                    这将是小写、大写或组合

                    【讨论】:

                      【解决方案12】:

                      我注意到,如果用户输入了一个文本字符串,但没有选择任何自动完成选项就离开了输入,即使该字符串与数组中的一个一致,也不会在隐藏的输入中设置任何值。 所以,在其他答案的帮助下,我做了这个:

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

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-09-26
                        • 2023-03-20
                        • 1970-01-01
                        • 2011-01-02
                        • 2013-02-17
                        • 2015-12-10
                        相关资源
                        最近更新 更多