【问题标题】:How to force rematch?如何强制复赛?
【发布时间】: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,这可能会起作用。

【问题讨论】:

  • 目前正则表达式匹配第二个备选方案(?&amp;qualifs)*+ (?&amp;declfacet),因此它不会尝试您定义lastnegdecl 的第三个备选方案,对吧?顺便说一句,你为什么在 (?&amp;qualifs)*+ 中使用 *+ ?不应该是*?吗?
  • @HåkonHægland 抱歉,我习惯于在嵌套模式中进行匹配 - 如果您将 ^$ 我错过了,它应该尝试一下。我现在将编辑我的问题。 *+ 是原子的,我相信没有或更贪婪。
  • 如果子模式失败,negdecllastnegdecl 似乎不会被定义,但两个子模式都依赖于另一个被定义的问题
  • @HåkonHægland 我实际上已经弄清楚了,并像(?(&lt;lastnegdecl&gt;)\g{lastnegdecl}|) 那样检查了第一个实例,但我发现我不明白为什么negdecl 没有在lastnegdecl 中定义.
  • 听起来是一个有趣的项目,是的。所以目前您正在通过调用(?{print ...}) 来使用正则表达式匹配的副作用?在正则表达式匹配之后,您没有使用 %+ 等生成的匹配变量吗?

标签: regex perl inverse-match


【解决方案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 不是同时还在rest 内连接decl,然后与qualifsrest 进行部分匹配如果它不匹配,它会再次做同样的事情。也许有人可以更好地解释它,但它有效。上面程序的输出是:

a
int
b
int
c
int

还有一个完整的匹配。

【讨论】:

    猜你喜欢
    • 2013-10-11
    • 2020-07-02
    • 2013-07-24
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2013-01-18
    相关资源
    最近更新 更多