在LPeg中匹配以特定结尾的字符串
2017-5-23 12:16:15
收藏:0
阅读:122
评论:3
我正在尝试捕获一个由a和b组成的字符串,但总是以b结尾。换句话说:
local patt = S'ab'^0 * P'b'
匹配aaab和bbabb但不匹配aaa或bba。然而上面的模式不匹配任何内容。这是因为S'ab'^0贪婪地匹配最后的b吗?我认为是这样,除了使用lpeg.Cmt之外,我想不出任何替代方案,但这似乎有些过度。但也许不是这样,有人知道如何匹配这样的模式吗?我看到了这个问题但解决方案的问题在于它会停在第一个结束标记处(即那里的'cat',这里的'b'),在我这种情况下,我需要接受中间的'b'。
顺便说一句, 我实际上正在尝试匹配其最外层规则是函数调用的表达式。 例如
func();
func(x)(y);
func_arr[z]();
都匹配但是
exp;
func()[1];
4 + 5;
不匹配。我的其余语法工作正常,我很确定这归结于相同的问题,但为了完整起见,我正在处理的语法大致如下:
top_expr = V'primary_expr' * V'postfix_op'^0 * V'func_call_op' * P';';
postfix_op = V'func_call_op' + V'index_op';
同样,V'postfix_op'^0吃掉了我预期在结尾处的func_call_op。
点赞
用户5043289
local final = P'b' * P(-1) local patt = (S'ab' - final)^0 * final
模式 `final` 需要出现在字符串末尾。
模式 `patt` 匹配集合 'ab',_除非_它紧跟着最终序列。那么它会确认我们已经有了最终序列,避免了最终的 'b' 被匹配。
这并不保证我们会得到任何 'a'(与问题中的模式一样)。
2016-06-20 05:30:26
用户17237579
很抱歉我的答案回复得太晚了,但我认为给这个问题一个更正确的答案是值得的。
我理解你只需要一个非盲目的贪婪匹配。但遗憾的是,LPeg的“官方文档”只告诉我们如何使用LPeg进行盲目的贪婪匹配(或重复)。但是,这种模式可以用解析表达式语法来描述。对于规则S,如果您想匹配尽可能多的E1,然后跟随E2,您需要编写
S <- E1 S / E2
解决a/b问题的方法如下
S <- [ab] S / 'b'
您可能需要优化规则,通过在第一选项中插入一些a来减少递归。
S <- [ab] 'a'* S / 'b'
这样会大大减少递归。至于您的实际问题,请看我的答案:
top_expr <- primary_expr p_and_f ';'
p_and_f <- postfix_op p_and_f / func_call_op
postfix_op <- func_call_op / index_op
2021-10-25 13:46:10
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
是的,没有回溯,所以你已经正确地识别出了问题。我认为解决方案是列出有效的'postfix_op'表达式; 我会将
V'func_call_op' + V'index_op'更改为V'func_call_op'^0 * V'index_op',并且还会将最后的V'func_call_op'更改为V'func_call_op'^1,以允许在末尾进行多个函数调用。更新:如评论中所建议的,
a/b问题的解决方案是(P'b'^0 * P'a')^0 * P'b'^1。