RegExp不区分大小写搜索整个单词与变量

RegExp case insensitive search for whole word with variable

本文关键字:单词 变量 搜索 不区 大小写 RegExp      更新时间:2023-09-26

我有一个具有字符串属性的对象,我想使用不区分大小写将其与多个用户输入进行比较。我的目标是将输入字符串与对象字符串相匹配,使关联值增加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。由于listobjArr的索引顺序是相同的,所以可以访问对象的值进行自增。

我在list数组中使用了.map()函数,如果你愿意,也可以使用for循环,这两种方法都可以工作。

我希望这对你有帮助!