我正在尝试使用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);
我怎样才能做到这一点?
答案 0 :(得分:365)
是的,请使用.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');
}
答案 1 :(得分:162)
替换
var result= string.search(/searchstring/i);
与
var result= string.search(new RegExp(searchstring, "i"));
答案 2 :(得分:37)
如果您只是搜索字符串而不是更复杂的正则表达式,则可以使用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;
答案 3 :(得分:20)
假设我们想在字符串变量needle
中找到字符串变量haystack
。有三个陷阱:
string.toUpperCase
和string.toLowerCase
。使用忽略大小写的正则表达式。例如,var needleRegExp = new RegExp(needle, "i");
后跟needleRegExp.test(haystack)
。needle
的值。请注意needle
不包含任何正则表达式special characters。使用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);
答案 4 :(得分:3)
ES6 +:
let string="Stackoverflow is the BEST";
let searchstring="best";
let found = string.toLowerCase()
.includes(searchstring.toLowerCase());
如果includes()
出现在一个或多个位置,则 true
会返回searchString
,否则会返回false
。
答案 5 :(得分:2)
如果您担心“未终止字符类”的情况,删除所有非字母数字字符会很有帮助:
searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,'');
答案 6 :(得分:2)
我喜欢@ CHR15TO的答案,不像我在其他类似问题上看过的其他答案,答案实际上显示了如何正确地逃避用户提供的搜索字符串(而不是说如果没有显示如何必要)。
然而,它仍然相当笨重,可能相对较慢。那么为什么不对编码器的常见要求有具体的解决方案呢? (为什么不将它包含在ES6 API BTW中?)
我对类似问题的回答[https://stackoverflow.com/a/38290557/887092]启用了以下内容:
import XMonad
import XMonad.Hooks.Script
import XMonad.Util.EZConfig
import XMonad.Layout.NoBorders
import XMonad.Config.Gnome
main = xmonad $ gnomeConfig {
terminal = "gnome-terminal",
modMask = mod4Mask,
layoutHook = smartBorders (layoutHook defaultConfig),
startupHook = do
execScriptHook "startup"
spawn "/usr/bin/xcompmgr"
}
`additionalKeys`
[((mod1Mask, xK_p), spawn "dmenu_run")]
答案 7 :(得分:1)
对于不区分大小写的比较,有两种方法:
将字符串转换为大写,然后使用strict运算符(===
)对它们进行比较。运算符如何严格处理操作数读取的内容:
http://www.thesstech.com/javascript/relational-logical-operators
使用字符串方法进行模式匹配:
使用“搜索”字符串方法进行不区分大小写的搜索。 阅读有关搜索和其他字符串方法的信息: 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>
答案 8 :(得分:1)
我经常这样做,并使用一个简单的五行原型来接受varargs。它快速,并且无处不在。
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')
答案 9 :(得分:0)
您可以将所有内容变为小写:
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= (string.toLowerCase()).search((searchstring.toLowerCase()));
alert(result);
答案 10 :(得分:0)
我正在尝试区分大小写的字符串搜索,我尝试了
var result = string.toLowerCase().match(searchstring)
还有
var result= string.search(new RegExp(searchstring, "i"));
但我做了一些小的修改,这对我有用
var result = string.match(new RegExp(searchstring, "i"));
这也可以是小写、大写或组合
答案 11 :(得分:-1)
我注意到如果用户输入一串文本但是在没有选择任何自动完成选项的情况下离开输入,则隐藏输入中没有设置值,即使该字符串与数组中的字符串重合。 所以,在其他答案的帮助下,我做到了这一点:
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 );
}
}