是否可以使用原子分组(或以其他方式)模拟所有格量词(.NET 不支持它)?
笔记。我发现(x+x+)++y
可以用 替换(?>(x+x+)+)y
,但这只是一个例子,我不知道是否总是{something}@+
等于(?>{something}@)
(@
量词在哪里)。
是否可以使用原子分组(或以其他方式)模拟所有格量词(.NET 不支持它)?
笔记。我发现(x+x+)++y
可以用 替换(?>(x+x+)+)y
,但这只是一个例子,我不知道是否总是{something}@+
等于(?>{something}@)
(@
量词在哪里)。
是的。我可以从他的经典Mastering Regular Expressions (3rd Edition)的第 142 页引用大师本人 Jeffrey Friedl 的话:
“从某种意义上说,所有格量词只是句法糖,因为它们可以用原子分组来模仿。类似
.++
的结果与 完全相同(?>.+)
,尽管智能实现可以比原子分组更优化所有格量词。”
不,仅此而已。占有量词只是原子团的一种方便的简写。
现在,如果您使用的风格也不支持原子组(如 JavaScript 和 Python),您可以使用前瞻来获得相同的效果:
(?=((x+x+)+))\1y
前瞻就像原子组一样工作,只是它不消耗匹配的内容。因此,您将其内容包装在捕获组中,然后使用反向引用进行消费。