我正在尝试在 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"));
s = 'a[b'; r = new RegExp(s)
导致语法错误(未终止的字符类)
如果您只是搜索字符串而不是更复杂的正则表达式,则可以使用 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
。有三个陷阱:
国际化应用程序应避免使用 string.toUpperCase 和 string.toLowerCase。改用忽略大小写的正则表达式。例如, var needleRegExp = new RegExp(needle, "i");其次是 needleRegExp.test(haystack)。一般来说,您可能不知道针的价值。注意 needle 不包含任何正则表达式特殊字符。使用 needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 转义这些。在其他情况下,如果您想精确匹配 needle 和 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);
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);
我经常这样做,并使用一个简单的接受可变参数的 5 行原型。它速度很快,可以在任何地方使用。
myString.containsIgnoreCase('red','orange','yellow')
/** * @param {...string} var_strings 要搜索的字符串 * @return {boolean} 如果字符串中包含任何参数,则为 true */ 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 要搜索的字符串 * @return {boolean} 如果所有参数都包含在字符串中,则为 true */ 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 } // 单元测试 let content = `FIRST SECOND他们被欲望所蒙蔽,他们不提供,他们同样对那些因为心软,即逃避劳苦和痛苦而放弃职责的人感到内疚。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。故此诸智者持于此,或舍大乐而得其物,或忍苦舍重者。为了头脑的灵活性而履行职责,也就是逃避劳苦和痛苦。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。故此诸智者持于此,或舍大乐而得其物,或忍苦舍重者。为了头脑的灵活性而履行职责,也就是逃避劳苦和痛苦。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。故此诸智者持于此,或舍大乐而得其物,或忍苦舍重者。为了头脑的灵活性而履行职责,也就是逃避劳苦和痛苦。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。故此诸智者持于此,或舍大乐而得其物,或忍苦舍重者。为了头脑的灵活性而履行职责,也就是逃避劳苦和痛苦。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。故此诸智者持于此,或舍大乐而得其物,或忍苦舍重者。为了头脑的灵活性而履行职责,也就是逃避劳苦和痛苦。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。所以这些东西必须由一个聪明的人来选择,这样要么通过拒绝快乐来获得他人,要么通过忍受痛苦来排斥更严重的痛苦。” 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 ? '找到' : '未找到') }) console.log('正在搜索', 'x, y, foo') 结果 = 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'); 控制台。 log(result ? 'Found' : 'Not Found') console.log('Searching for all', 'foo, bar') result = content.containsAllIgnoreCase('foo', 'bar'); console.log(result ? “找到”:“未找到”)
不区分大小写的比较有两种方式:
将字符串转换为大写,然后使用严格运算符 (===) 进行比较。使用字符串方法进行模式匹配:使用“搜索”字符串方法进行不区分大小写的搜索。
您可以将所有内容设为小写:
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 );
}
}
string.match(/best/i);
.match
进行布尔比较。它在第一个结果之外进行搜索。您需要在第一次匹配.test
或.search
后停止。检查性能 here。toLowerCase
很可能无法通过土耳其测试 (moserware.com/2008/02/does-your-code-pass-turkey-test.html) 和类似的案例转换问题。我不确定ReGex
如何处理它,但如果我不得不猜测我会说得更好。var text = "best"; var exp = new RegExp(test, "i");
。这与/best/i
相同。