Search()在RegExp中添加额外的括号 - 无效的正则表达式

时间:2017-04-06 19:46:57

标签: javascript angularjs regex

我正在尝试使用搜索匹配多个案例和正则表达式。我的正则表是:

var r = new RegExp(actualArr[i] + '(e?s)?(\>|$)', 'gi')

我正在使用搜索:

if(expected.search(r) !== -1){...}

当我使用搜索在控制台中运行正则表达式时,它运行正常,但通过我的应用程序,我收到以下错误:

SyntaxError: Invalid regular expression: /(Squat(e?s)?/: Unterminated group

当我打印出我的正则表达式时,我明白了:

/Squat(e?s)?(>|$)/gi

为什么在这里添加额外的(?我错过了什么?

这是完整的代码块:

let matchPlural = function(actual,expected) {
        let actualArr = actual.split(" ");
        for(let i = 0; i < actualArr.length; i++){
            let r = new RegExp(actualArr[i] + '(e?s)?(\>|$)', 'gi')
            if (expected.search(r) !== -1){
                return true;
            }
        }

        return false;
    }

作为旁注,我正在开发AngularJS,我认为这不会影响任何事情......

1 个答案:

答案 0 :(得分:0)

有时我认为actualArr[i]是一个单词数组,必须以括号开头。由于“括号”在正则表达式中定义了一个组,因此当您使用'(e?s)?(\>|$)', 'gi')

连接单词时,该组将变为无效

运行以下代码段并查看控制台结果

var applyFix = true;

let matchPlural = function(actual,expected) {
    let actualArr = actual.split(" ");
    for(let i = 0; i < actualArr.length; i++) {

      let word = actualArr[i];
      
      // Remove any non-word character
      if(applyFix) word = word.replace(/\W/g,'');

      let r = new RegExp(word + '(e?s)?(\>|$)', 'gi')
      if (expected.search(r) !== -1){
          return true;
      }
    }
    return false;
}

console.log(matchPlural('Foo Dummy Squat','Hello Squate'))
console.log(matchPlural('Foo Dummy Squat','Hello Squates'))
console.log(matchPlural('Foo Dummy Squat','Hello Squats'))
console.log(matchPlural('Foo Dummy (Squat','Hello Squats'))

// Disable fix
applyFix = false

console.log(matchPlural('Foo Dummy (Squat','Hello Squats'))