我有一个带有字符串属性的对象,我希望使用不区分大小写来比较多个用户输入。我的目标是将输入字符串与对象字符串相匹配,以将相关值增加1(如果它匹配)。
var objArr = [
{"O": 0},
{"foo": 0},
{"faa": 0},
{"A": 0}
];
除了不区分大小写之外,一切都在顺利进行。我使用的RegExp方法只查找一个字母而不是整个单词。我可能没有使用正确的语法,但我无法在google上找到解释/i
标志和变量的结果。
我最接近的尝试是:
var re = new RegExp(b, "i"); //problem here
if (allinputs[i].value.match(re)) { //and here
此代码确实允许不区分大小写,但它不会查找整个对象属性字符串并停止字母。例如打字" foo"将导致匹配" O"因为它包含字母" O"和属性" O"在" foo"之前。因此,打字" faa"匹配" faa"而不是" A",因为" faa"是在" A"之前在对象数组中。字符串不存在于我的对象中,如" asfo"仍将匹配" O"因为一个共同的信。
有没有办法使用regExp
/i flag
搜索带有不区分大小写的整个属性字符串?我想尽可能避免使用.toUpperCase()或.toLowerCase()方法。
在这里小提琴:https://jsfiddle.net/Lau1989/b39Luhcu/
感谢您的帮助
答案 0 :(得分:2)
要检查正则表达式是否与整个字符串匹配,可以使用断言起始字符(^
)并断言结束($
)。
例如,hello
匹配e
但不匹配^e$
。
对于您的代码,只需将^
添加到正则表达式并附加$
:
var re = new RegExp("^" + b + "$", "i");
修改:某些字符在正则表达式中具有特殊含义(^
,$
,\
,.
,*
等。如果您需要使用其中任何一个字符,则应使用\
进行转义。为此,您可以使用这个简单的替换:
str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
所以,你的正则表达式最终将成为
new RegExp("^" + b.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$", "i");
有关转义正则表达式的详细信息,请参阅this question。
您也可以将两个字符串转换为小写,然后直接比较它们。这将允许您使用特殊字符。
if (stringA.toLowerCase() == stringB.toLowerCase())) {
...
}
答案 1 :(得分:2)
你的方法几乎是正确的,但你需要限制你的正则表达式以避免使用^(字符串的开头)和$(字符串的结尾)的任何匹配。
以下是我制作的符合您需求的代码:
function process()
{
var allinputs = document.querySelectorAll('input[type="text"]');
var list = new Array();
var input = "";
objArr.map(function(value, index, array){ list.push(Object.keys(value))})
for(var i = 0; i < allinputs.length; i++)
{
input = allinputs[i];
if(input.value)
{
list.map(function( item, index, array ) {
var re = new RegExp("^"+input.value+"$", "i");
if(item.toString().match(re))
{
allinputs[i].value = "1";
objArr[index][item] += 1;
allinputs[i].style.backgroundColor = "lime";
document.getElementById('output').innerHTML += item + " : " + objArr[index][item] + "<br />";
}
});
}
}
}
这里首先要创建一个来自objArr
的密钥列表,这样我们就可以轻松访问密钥名称以匹配您输入的内容
objArr.map(function(value, index, array){ list.push(Object.keys(value))})
然后逻辑仍然和你已经做的一样,在所有输入中都是for循环。不同之处在于匹配将在list
数组而不是objArr
上进行。由于list
和objArr
的索引序列相同,因此可以访问要增加的对象值。
我在.map()
数组中使用了list
函数,如果您愿意,也可以使用for循环,这两种方法都可以。
我希望这能帮到你!