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

时间:2016-10-07 21:04:08

标签: javascript regex

我有一个带有字符串属性的对象,我希望使用不区分大小写来比较多个用户输入。我的目标是将输入字符串与对象字符串相匹配,以将相关值增加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/

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

要检查正则表达式是否与整个字符串匹配,可以使用断言起始字符(^)并断言结束($)。

例如,hello匹配e但不匹配^e$

对于您的代码,只需将^添加到正则表达式并附加$

var re = new RegExp("^" + b + "$", "i");

fiddle

修改:某些字符在正则表达式中具有特殊含义(^$\.*等。如果您需要使用其中任何一个字符,则应使用\进行转义。为此,您可以使用这个简单的替换:

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上进行。由于listobjArr的索引序列相同,因此可以访问要增加的对象值。

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

我希望这能帮到你!