首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用LPeg进行前瞻性工作

如何正确使用LPeg进行前瞻性工作
EN

Stack Overflow用户
提问于 2014-11-19 05:10:17
回答 1查看 434关注 0票数 3

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

代码语言:javascript
复制
local lpeg = require 'lpeg'
local str1 = 'dogcat'
local patt1 = lpeg.C(lpeg.P('dog')) * #lpeg.P('cat')
print(lpeg.match(patt1, str1))

输出:dog

为了匹配以dog开头的字符串,后面跟着任何字符序列,然后是cat(但不使用它),就像regexlookearve(dog.+?)(?=cat)一样,我尝试了以下方法:

代码语言:javascript
复制
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部件匹配任何字符序列都是正确的,不是吗?

怎么修呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 06:31:57

您需要在可以匹配的前面的每个位置上否定"cat“:

代码语言:javascript
复制
local patt2 = lpeg.C(lpeg.P"dog" * (lpeg.P(1)-lpeg.P"cat") ^ 1) * #lpeg.P"cat"

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

代码语言:javascript
复制
+   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"相媲美了。

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

代码语言:javascript
复制
+   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 "

下面是完整的脚本:

代码语言:javascript
复制
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))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27009411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档