3

我想在以下情况下强制重新匹配 - 我试图在列表中的每个元素之后反向匹配限定符。换句话说,我有:

"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正在捕获的新匹配项,这可能会起作用。

4

1 回答 1

1

好吧,经过一番尝试,我终于弄明白了(除了我在原始帖子中遇到的明显空白问题):

"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|\bfloat\b)\s*+)
    (?<declfacet>\s*+[_a-zA-Z][_a-zA-Z0-9]*+\s*+)
)


^((?&qualifsfacet)(?!(?&decl))
                |(?&qualifs)*+(?&declfacet)
                |(?<restoutter>(?=(?&qualifsfacet)(?&declfacet)
                (?<rest>(?(<rest>)\g{rest}),(?&decl)))
                ((?&qualifs)(?&declfacet)\g{rest}|(?&restoutter)))
                |(?&qualifsfacet)(?&declfacet)(,(?&declfacet))*+)$
                }xxs;

基本上我正在做一个积极的前瞻,decl用代码调用但qualifs不是同时decl在内部连接然后与和rest进行部分匹配,如果它不匹配,它会再次做同样的事情。也许有人可以更好地解释它,但它有效。上面程序的输出是:qualifsrest

a
int
b
int
c
int

并且有一个完整的匹配。

于 2021-09-22T16:55:30.303 回答