繁体   English   中英

不区分大小写的搜索

[英]Case-insensitive search

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

我怎样才能做到这一点?

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

代替

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

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

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

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

  1. 国际化的应用程序应该避免string.toUpperCasestring.toLowerCase 使用忽略大小写的正则表达式。 例如, var needleRegExp = new RegExp(needle, "i"); 然后是needleRegExp.test(haystack)
  2. 在一般情况下,你可能不知道的价值needle 请注意, needle不包含任何正则表达式特殊字符 使用needle.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, "\\\\$&");转义这些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);

ES6+:

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


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

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

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

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

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

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

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

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

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

  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>

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

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

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

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

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

并且

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

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

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

这也将是小写、大写或组合

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

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

            }
        } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM