【问题标题】:Wrap a regular expression so that it only matches the whole string包装正则表达式,使其仅匹配整个字符串
【发布时间】:2017-11-29 03:22:51
【问题描述】:

相关:Regex - Match whole string

我想要一个给定的正则表达式来匹配整个字符串。例如,当给定一个正则表达式/abc/ 时,它应该只匹配字符串"abc" 而不是"abcd"。我已经搜索了上述问题,它的情况与我的情况相似。这里的区别在于,正则表达式不是直接写在我的代码中的。所以不能直接在源码中将/abc/改成/^abc$/

假设,我想要一个带有两个参数的函数:一个“正则表达式”(例如/abc/)和一个string(例如'abc')。当且仅当给定的正则表达式匹配 whole 字符串时,该函数才返回匹配的结果,否则返回 null

我正在尝试什么:

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

这段代码正确吗?有更好的方法吗?

【问题讨论】:

  • 您应该提供示例输入并显示您想要的输出与实际输出的对比
  • @alfasin 有什么不清楚的地方吗?也许“例如,我想要match(/abc/, 'abc') 返回真值和match(/abc/, 'abc1') 返回假值”就像链接帖子中所说的那样?是的,给定的代码确实适用于这个特定的测试用例,但我不确定是否有任何其他情况可能会破坏此代码。
  • 不,不清楚。我还是不明白你在问什么……
  • @alfasin 现在好点了吗?我不知道如何使它更清楚......

标签: javascript regex string match


【解决方案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

【讨论】:

  • 检查匹配长度并不总是提供与添加^$'abcc'.match(/abc+?/)[0].length === 3'abcc'.match(/^abc+?$/)[0].length === 4相同的结果。
猜你喜欢
  • 1970-01-01
  • 2021-10-09
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
相关资源
最近更新 更多