作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在以下情况下强制重新匹配 - 我试图在列表中的每个元素之后反向匹配限定符。换句话说,我有:
"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
restqualifs
和 rest
进行部分匹配,如果不匹配,它将再次执行相同的操作。也许有人可以更好地解释它,但它确实有效。上面程序的输出是:
a
int
b
int
c
int
并且有一个完全匹配。
关于regex - 如何强制复赛?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69283650/
我是一名优秀的程序员,十分优秀!