Case-insensitive search
我正在尝试在javascript中使用两个字符串进行不区分大小写的搜索。
通常是这样的:
1 2 3 | var string="Stackoverflow is the BEST"; var result= string.search(/best/i); alert(result); |
但是我需要搜索第二个字符串;如果没有标记,它会很好地工作:
1 2 3 4 | var string="Stackoverflow is the BEST"; var searchstring="best"; var result= string.search(searchstring); alert(result); |
如果我在上面的示例中添加
1 2 3 4 | var string="Stackoverflow is the BEST"; var searchstring="best"; var result= string.search(/searchstring/i); alert(result); |
我怎样才能做到这一点?
是的,使用
1 2 3 4 5 6 7 | var string ="Stackoverflow is the BEST"; var result = string.match(/best/i); // result == 'BEST'; if (result){ alert('Matched'); } |
在JavaScript中,使用这样的正则表达式可能是最整洁和最明显的方法,但请记住,它是一个正则表达式,因此可以包含regex元字符。如果您想从其他地方获取字符串(例如,用户输入),或者如果您想避免转义大量元字符,那么最好使用
1 2 3 4 5 6 7 | 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'); } |
替换
1 | var result= string.search(/searchstring/i); |
具有
1 | var result= string.search(new RegExp(searchstring,"i")); |
如果只搜索字符串而不是更复杂的正则表达式,则可以使用
1 2 3 4 5 6 7 8 9 | 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); |
或者在一行中:
1 | var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0; |
假设我们想在字符串变量
考虑到第(1)和(2)点,示例如下:
1 2 3 4 5 | 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+:
1 2 3 4 5 6 | let string="Stackoverflow is the BEST"; let searchstring="best"; let found = string.toLowerCase() .includes(searchstring.toLowerCase()); |
如果
我喜欢@chr15to的答案,与我在其他类似问题上看到的其他答案不同,该答案实际上显示了如何正确地转义用户提供的搜索字符串(而不是说不显示如何转义是必要的)。
然而,它仍然相当笨重,而且可能相对较慢。那么,为什么不针对编码人员的常见需求制定一个具体的解决方案呢?(为什么不将其包含在ES6 API BTW中?)
我对类似问题的回答是[https://stackoverflow.com/a/38290557/887092]可以实现以下功能:
1 2 3 | var haystack = 'A. BAIL. Of. Hay.'; var needle = 'bail.'; var index = haystack.naturalIndexOf(needle); |
如果您关心"未终止字符类"的情况,那么删除所有非字母数字字符将很有帮助:
1 | searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,''); |
我经常这样做,并使用一个接受varargs的简单5行原型。它很快,在任何地方都能工作。
1 | myString.containsIgnoreCase('red','orange','yellow') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | /** * @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') |
区分大小写比较有两种方法:
将字符串转换为大写,然后使用strict运算符(
使用字符串方法进行模式匹配:
使用"search"字符串方法进行不区分大小写的搜索。阅读搜索和其他字符串方法:http://www.thesstech.com/pattern-matching-using-string-methods
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!doctype html> <html> <head> // 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)); </head> </html> |
您可以将所有内容变为小写:
1 2 3 4 | var string="Stackoverflow is the BEST"; var searchstring="best"; var result= (string.toLowerCase()).search((searchstring.toLowerCase())); alert(result); |
我注意到,如果用户输入一个文本字符串,但不选择任何自动完成选项而离开输入,则在隐藏的输入中不会设置任何值,即使字符串与数组中的值一致。所以,在其他答案的帮助下,我做了这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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 ); } } |