gpt4 book ai didi

regex - 如何强制复赛?

转载 作者:行者123 更新时间:2023-12-04 17:11:50 25 4
gpt4 key购买 nike

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

"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 重新触发匹配,这可能会奏效。

最佳答案

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

"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

并且有一个完全匹配。

关于regex - 如何强制复赛?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69283650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com