【问题标题】:Javascript RegEx: Same character part of two matches [duplicate]Javascript RegEx:两个匹配项的相同字符部分[重复]
【发布时间】:2017-12-14 14:00:07
【问题描述】:

我怎样才能让同一个角色成为两个不同匹配项的一部分?

例如我希望"abc".match(/ab|bc/g) 产生两个匹配 - 一个用于“ab”,它将在这种情况下进行,但还有一个用于“bc”。换句话说,“b”字符是我正在寻找的两个子字符串的一部分。

【问题讨论】:

  • 不可能使用单个正则表达式
  • 很有可能。只需运行 RegExp#exec 并使用 (?=(ab|bc)) 正则表达式获取 match[1],同时手动推进 RegExp 索引。

标签: javascript regex


【解决方案1】:

您不能字面上通过一个match 调用来做到这一点。一旦角色被消耗,它就会被消耗。但是,Wiktor 指出与 an answer 重复(我应该已经意识到),它通过重复的 exec 调用做了一个非常聪明的事情。

根据实际情况,另一个选择是足够接近,以便您可以通过后处理修复它,使用积极的前瞻断言。我们可以说“仅匹配a,如果它紧跟b - 但不要使用b”。然后,如果我们有 a 结果,我们知道它们确实是 ab 结果(否则不会匹配),我们可以相应地更改它们:

var result = "abc".match(/a(?=b)|bc/g);
if (result) {
    result = result.map(function(entry) {
        return entry === "a" ? "ab" : entry;
    });
}

或者使用 ES2015+:

let result = "abc".match(/a(?=b)|bc/g);
if (result) {
    result = result.map(e => e === "a" ? "ab" : e);
}

如果a部分不同,你可以根据实际数据使用其他检查(如entry.length === 1!entry.endsWith("b")等)。

现场示例(ES5 及更早版本假设a):

var result = "abc".match(/a(?=b)|bc/g);
if (result) {
    result = result.map(function(entry) {
        return entry === "a" ? "ab" : entry;
    });
}
console.log(result);

【讨论】:

  • 谢谢!我刚刚学到了更多关于积极展望的知识; )
【解决方案2】:

您将需要运行两个正则表达式。一旦一个字符被正则表达式“消耗”,它就不再可用了。 IE。每个正则表达式只能匹配一个字符。

或者,您可以返回 3 个可能的值,并根据返回值确定输出。例如。 /abc|ab|bc/g。如果两者都存在,这将返回abc,那么您可以简单地在终端b 上拆分,否则它将返回abbc(如果两者都存在)。

【讨论】:

  • 是的。但是我们可以非常接近。 :-)
  • 是的,从技术上讲,它可以与非捕获组匹配两次,但不会被捕获或返回,因此在他的情况下无用。 :(
  • 不是真的——看我的回答。 :-)
  • 我看不出非捕获组在这里玩得怎么样。
  • 你是对的。我修改了答案。
猜你喜欢
  • 2012-02-22
  • 2014-07-17
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2014-08-05
  • 1970-01-01
相关资源
最近更新 更多