不区分大小写的搜索

我试图在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标志,就会搜索搜索字符串,而不是变量"搜索字符串"中的内容(下一个例子不工作)。

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

我怎样才能做到这一点呢?

解决办法

是的,使用.match,而不是.search.match调用的结果将返回被匹配的实际字符串本身,但它仍然可以作为一个布尔值使用。

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

if (result){
    alert('Matched');
}

在JavaScript中使用这样的正则表达式可能是最整洁、最明显的方式,但要记住它*是一个正则表达式,因此可以包含regex元字符。如果你想从其他地方获取字符串(例如,用户输入),或者你想避免转义大量的元字符,那么你最好使用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');
}
评论(4)

替换

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

替换为

var result= string.search(new RegExp(searchstring, "i"));
评论(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;
评论(0)

假设我们想在字符串变量 "干草垛 "中找到字符串变量 "针"。 有三个疑难杂症。

  1. 国际化应用应该避免使用string.toUpperCasestring.toLowerCase。 使用忽略大小写的正则表达式来代替。 例如,var needleRegExp = new RegExp(new needle, "i");后面是needleRegExp.test(haystack)
  2. 一般情况下,你可能不知道needle的值。 要注意needle不包含任何正则表达式[特殊字符][1]。 使用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);

[1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions?redirectlocale=en-US&redirectslug=JavaScript%2FGuide%2FRegular_Expressions

评论(0)

ES6+。

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

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

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

评论(0)

如果你担心在"未端字类&quot。 的情况下,去掉所有非字母数字的字符会有帮助。

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

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

然而,它仍然相当笨拙,而且可能相对较慢。 所以,为什么不对代码编写者的共同需求有一个具体的解决方案呢? (另外,为什么不把它包含在 ES6 API 中呢?)

我对类似问题的回答[https://stackoverflow.com/a/38290557/887092]实现了以下几点

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

对大小写不敏感的比较有两种方法。

  1. 将字符串转换为大写,然后使用严格运算符(===)进行比较。 严格运算符如何处理操作数阅读东西在。 http://www.thesstech.com/javascript/relational-logical-operators

  2. 使用字符串方法进行模式匹配。

使用"search" 字符串方法进行不区分大小写的搜索。 阅读有关搜索和其他字符串方法的内容,请点击。 http://www.thesstech.com/pattern-matching-using-string-methods

<!doctype html&gt。

。 。 <script>

// 第一种方式

var a = "apple"。 var b = "apple"。 如果 (a.toUpperCase() === b.toUpperCase()) { alert("equal"); }

//2nd way

var a = &quot.Null and void";。 Null和void"。 document.write(a.search(/null/i))。

</script>
评论(0)

我经常这样做,并使用一个简单的5行原型,接受varargs。 它,而且在任何地方都能

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

<!--开始片段。 js hide: false console: true babel.false --> -- begin snippet: js hide: false console: true false -->

/**
 * @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')

<!--结束片段-->

评论(0)

你可以把所有的东西都写成小写。

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

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

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

            }
        } 
评论(0)