gpt4 book ai didi

lua - 如何使用 LPeg 正确地进行前瞻

转载 作者:行者123 更新时间:2023-12-04 16:07:41 26 4
gpt4 key购买 nike

要匹配以 dog 开头,后跟 cat(但不使用 cat)的字符串,这是可行的:

local lpeg = require 'lpeg'
local str1 = 'dogcat'
local patt1 = lpeg.C(lpeg.P('dog')) * #lpeg.P('cat')
print(lpeg.match(patt1, str1))

输出:

要匹配以 dog 开头的字符串,后跟任何字符序列,然后是 cat(但不使用它),就像正则表达式先行 ( dog.+?)(?=cat),我试过这个:

local str2 = 'dog and cat'
local patt2 = lpeg.C(lpeg.P("dog") * lpeg.P(1) ^ 1) * #lpeg.P("cat")
print(lpeg.match(patt2, str2))

我的预期结果是dog and,但它返回nil

如果我放弃前瞻部分(即使用模式 lpeg.C(lpeg.P("dog") * lpeg.P(1) ^ 1)),它可以匹配整个字符串成功。这意味着 * lpeg.P(1) ^ 1 部分正确匹配任何字符序列,不是吗?

如何解决?

最佳答案

您需要在前瞻中可以匹配的每个位置否定“cat”:

local patt2 = lpeg.C(lpeg.P"dog" * (lpeg.P(1)-lpeg.P"cat") ^ 1) * #lpeg.P"cat"

我认为插入我一直在使用的调试器 ( pegdebug ) 是合适的,因为它在这种情况下会有所帮助。这是它为原始 lpeg 表达式生成的输出:

+   Exp 1   "d"
+ Dog 1 "d"
= Dog 1-3 "dog"
+ Separator 4 " "
= Separator 4-11 " and cat"
+ Cat 12 ""
- Cat 12
- Exp 1

您可以看到分隔符表达式“吃掉”了所有字符,包括“cat”,并且没有任何内容可以与 P"cat" 匹配。

修改后的表达式的输出如下所示:

+   Exp 1   "d"
+ Dog 1 "d"
= Dog 1-3 "dog"
+ Separator 4 " "
= Separator 4-8 " and "
+ Cat 9 "c"
= Cat 9-11 "cat"
= Exp 1-8 "dog and "
/ Dog 1 0
/ Separator 4 0
/ Exp 1 1 "dog and "

这是完整的脚本:

require 'lpeg'
local peg = require 'pegdebug'
local str2 = 'dog and cat'
local patt2 = lpeg.P(peg.trace { "Exp";
Exp = lpeg.C(lpeg.V"Dog" * lpeg.V"Separator") * #lpeg.V"Cat";
Cat = lpeg.P("cat");
Dog = lpeg.P("dog");
Separator = (lpeg.P(1) - lpeg.P("cat"))^1;
})
print(lpeg.match(patt2, str2))

关于lua - 如何使用 LPeg 正确地进行前瞻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27009411/

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