RegExp不区分大小写搜索整个单词与变量
RegExp case insensitive search for whole word with variable
我有一个具有字符串属性的对象,我想使用不区分大小写将其与多个用户输入进行比较。我的目标是将输入字符串与对象字符串相匹配,使关联值增加1(如果匹配的话)。
var objArr = [
{"O": 0},
{"foo": 0},
{"faa": 0},
{"A": 0}
];
除了大小写不敏感之外,一切都很顺利。我使用的RegExp方法只查找一个字母,而不是整个单词。我可能没有使用正确的语法,但我无法在谷歌上找到解释/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/
谢谢你的帮助
要检查一个正则表达式是否匹配整个字符串,您可以使用断言开始字符(^
)和断言结束字符($
)。
例如,hello
匹配e
,但不匹配^e$
。
对于您的代码,只需将^
添加到regex并添加$
:
var re = new RegExp("^" + b + "$", "i");
小提琴
编辑:一些字符在正则表达式中有特殊的含义(^
, $
, '
, .
, *
等)。如果您需要使用这些字符中的任何一个,它们应该用'
转义。要做到这一点,您可以使用这个简单的替换:
str.replace(/['-'[']'/'{'}'(')'*'+'?'.'''^'$'|]/g, "''$&");
那么你的正则表达式最终会是
new RegExp("^" + b.replace(/['-'[']'/'{'}'(')'*'+'?'.'''^'$'|]/g, "''$&") + "$", "i");
有关转义正则表达式的更多信息,请参阅此问题。
您也可以将两个字符串转换为小写,然后直接比较它们。这也允许你使用特殊字符。
if (stringA.toLowerCase() == stringB.toLowerCase())) {
...
}
您的方法几乎是正确的,但是您需要限制您的正则表达式以避免使用^(字符串的开始)和$(字符串的结束)的任何匹配。
下面是我编写的代码,可能适合您的需要:
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
的索引顺序是相同的,所以可以访问对象的值进行自增。
我在list
数组中使用了.map()
函数,如果你愿意,也可以使用for循环,这两种方法都可以工作。
我希望这对你有帮助!
- 将函数的上下文应用于javascript变量
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 将PHP变量传递给jQuery时遇到问题
- 如何通过ajax刷新JSF填充的javascript变量
- 参数变量出现ngTable指令问题
- 通过javascript重定向html传递php变量
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 全局变量和全局对象的属性之间有什么区别吗
- javascript正则表达式:使用单词边界将变量传递给regexp
- 如何将字母从变量隔离到它自己的变量中,停止在单词长度处
- 如何使用拼接方法将输入的单词与提示分开并将它们分配给变量
- JavaScript正则表达式测试字符串是否包含特定单词(带变量)
- 使用单词'英语'因为变量/对象名称在javascript中不起作用
- Selenium:如何验证变量中字符串中的单词
- 如何将Javascript数字变量转换为特定的单词
- 可以't在JavaScript变量中添加更多单词
- 有一种方法,我可以改变骆驼的情况下,以空格分隔的单词变量的内容
- RegExp不区分大小写搜索整个单词与变量
- 如果变量包含两个单词,则删除并替换它