我正在写一个PEG文件,在pest中用于我们的dsl。我需要解析一个键值,其中value是三引号内的正则表达式。我不能为它写一个有害规则。
值为"""Some regex here"""
我定义的规则是:

TQ = {"\"\"\""}

我需要
regex = {TQ ~ Anything but not TQ ~ TQ}

我试过了
regex = {TQ ~(!TQ)* ~ TQ}

这不起作用也不合适
regex = {TQ ~ ANY* ~ TQ}

贪婪地消耗所有的标记,甚至在结尾的三个引号
规则应该在三个引号中解析regex,如
 """^\w+\s+\d\d\d\d\-\d\d\-\d\d\s+\d\d\:\d\d\:\d\d\s+AB_02V\s+\d+\s+.*"""

最佳答案

您的定义非常接近正确,但有一点需要注意:Pest否定谓词在成功时不会消耗任何输入。因此,如果只告诉解析器不要匹配某些内容,解析器可能会陷入困境,无法取得进展。
它还需要知道匹配什么。在这种情况下,那将是任何事情。Pest有一个内置规则ANY用于此目的:

tq = { "\"\"\"" }

re = { (!tq ~ ANY)* }

regex = { tq ~ re ~ tq }

如果你想更深入地潜水,这里有pest book

07-26 06:28