【问题标题】:Can you forward-reference a named capture group in JS regex?你能在 JS 正则表达式中前向引用一个命名的捕获组吗?
【发布时间】:2021-07-31 07:38:31
【问题描述】:

所以我试图用正则表达式(JS 风格)做的事情本质上是匹配带有双字母的单词(即相同字符的两个实例,彼此直接相邻),但只捕获第二个字母。例如,我想在letter 中捕获第二个t,在manner 中捕获第二个n,在glass 中捕获第二个s。

我想通过反向引用一个命名的捕获组来解决这个问题,我称之为ditto。所以在这种情况下,正则表达式将是/(?:\k<ditto>)(?<ditto>t|n|s)/g...

...但是这最终匹配了它不应该匹配的字符串,即只有一个 t、n 或 s 的字符串 - 即,它与与/[tns]/g 相同 - 我刚刚发现这是因为\k 无法反向引用尚未找到的<ditto> 匹配项,因此第一个捕获组可能只是空的。

所以我真正需要的是前向引用,而不是后向引用,但那些......不存在,是吗?那你还怎么做同样的事情呢?

【问题讨论】:

  • 捕获第一个或第二个字母有什么区别,因为它们是相同的?
  • @Barmar 因为它随后是字符串操作,以用不同的子字符串替换捕获的任何内容,并且我需要“在另一个 X 之前/之后用 Y 替换所有 X 实例”的功能。反向引用适用于“后跟 X”,但不适用于“先于 X”,两个字母中的哪一个匹配很重要,因为输出字符串“XY”不能与“YX”互换。

标签: javascript regex


【解决方案1】:

在这两个事件周围使用捕获组。然后您可以将一个复制到替换以保留它,同时替换另一个。

string.replace(/([tns])(\1)/g, "X$2"); // replace first with X
string.replace(/([tns])(\1)/g, "$1X"); // replace second with X

【讨论】:

  • 直接字符串替换之类的并不能完全满足我想要做的事情(我正在大量简化)......但我不认为只是将类别移动到第一次捕获分组并在第二个中反向引用它 - 首先消除了前向引用的需要。这适用于我的用例,所以无论如何我都会接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2011-03-03
  • 2018-11-08
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
相关资源
最近更新 更多