【发布时间】:2021-11-15 21:17:03
【问题描述】:
我想在以下情况下强制重新匹配 - 我试图在列表中的每个元素之后反向匹配限定符。换句话说,我有:
"int a, b, c" =~ m{
(?(DEFINE)
(?<qualifs>\s*(?<qualif>\bint\b|\bfloat\b)\s*+(?{print $+{qualif} . "\n"}))
(?<decl>\s*(?!(?&qualif))(?<ident>[_a-zA-Z][_a-zA-Z0-9]*+)\s*(?{print $+{ident} . "\n"}))
(?<qualifsfacet>\s*\bint\b\s*+)
(?<declfacet>[_a-zA-Z][_a-zA-Z0-9]*+)
)
^((?&qualifsfacet)*+(?!(?&decl))
|(?&qualifs)*+(?&declfacet)
|((?&qualifsfacet)
(?&declfacet)(?<negdecl>\g{lastnegdecl}(,(?&decl)))
|(?&qualifs)*+(?&declfacet)(?<lastnegdecl>\g{negdecl})
(?# Here how to force it to retry last with new lastnegdecl)))$
}xxs;
并且想拥有:
a
int
b
int
c
int
作为输出。目前只有这样:
a
int
int
我认为,如果有办法告诉正则表达式机器重新触发匹配正在捕获的新 lastnegdecl,这可能会起作用。
【问题讨论】:
-
目前正则表达式匹配第二个备选方案
(?&qualifs)*+ (?&declfacet),因此它不会尝试您定义lastnegdecl的第三个备选方案,对吧?顺便说一句,你为什么在(?&qualifs)*+中使用*+?不应该是*?吗? -
@HåkonHægland 抱歉,我习惯于在嵌套模式中进行匹配 - 如果您将
^和$我错过了,它应该尝试一下。我现在将编辑我的问题。*+是原子的,我相信没有或更贪婪。 -
如果子模式失败,
negdecl和lastnegdecl似乎不会被定义,但两个子模式都依赖于另一个被定义的问题 -
@HåkonHægland 我实际上已经弄清楚了,并像
(?(<lastnegdecl>)\g{lastnegdecl}|)那样检查了第一个实例,但我发现我不明白为什么negdecl没有在lastnegdecl中定义. -
听起来是一个有趣的项目,是的。所以目前您正在通过调用
(?{print ...})来使用正则表达式匹配的副作用?在正则表达式匹配之后,您没有使用%+等生成的匹配变量吗?
标签: regex perl inverse-match