包装正则表达式,使其仅匹配整个字符串

时间:2017-11-29 03:22:51

标签: javascript regex string match

相关:Regex - Match whole string

我想要一个给定的正则表达式来匹配整个字符串。例如,当给定正则表达式/abc/时,它应仅匹配字符串"abc",而不匹配"abcd"。我已经搜索了上面的问题,这个问题与我的情况类似。这里的区别是正则表达式不直接写在我的代码中。因此,我无法直接在源代码中将/abc/更改为/^abc$/

让我们说,我想要一个带有两个参数的函数:'regexp'(例如/abc/)和string(例如'abc')。当且仅当给定的regexp与整个字符串匹配时,该函数返回匹配的结果,否则返回null

我正在尝试:

function match(regexp, string) {
  var parse = /\/(.*)\/(.*)/.exec(regexp);
  var reg = new RegExp('^' + parse[1] + '$', parse[2]);
  return string.match(reg);
}

这段代码是否正确?有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

您将/a+|b+/等正则表达式转换为仍然匹配的^a+|b+$ 'xbb'。解决方案是使用匿名组包装内部正则表达式:^(?:a+|b+)$

此外,您目前截断了有用的正则表达式标记,例如/.../m/.../i

或者,您可以简单地使用原始正则表达式并检查结果是否涵盖整个输入字符串长度:

function fullmatch(regex, string) {
  const result = string.match(regex);
  return !!result && result[0].length === string.length;
}

// Example:
console.log(fullmatch(/a+|b+/, 'xbb')); // false
console.log(fullmatch(/a+|b+/, 'bbb')); // true

// Respects lazy quantifier:
console.log(fullmatch(/b+?/, 'bbb'));   // false
console.log(fullmatch(/b+/, 'bbb'));    // true

// Invariant to global flag g:
console.log(fullmatch(/b+?/g, 'bbb'));  // false
console.log(fullmatch(/b+/g, 'bbb'));   // true