我正在尝试使用a和b的组合捕获字符串,但总是以b结尾。换句话说:
local patt = S'ab'^0 * P'b'
匹配aaab
和bbabb
但不匹配aaa
或bba
。但上述情况并不匹配。这是因为S'ab'^0
贪婪并与最终的b
相匹配吗?我想是这样,除了可能诉诸于lpeg.Cmt
似乎有点矫枉过正之外,我想不出任何其他选择。但也许不是,任何人都知道如何匹配这样的模式?我看到了this question,但解决方案的问题是它会停在第一个结束标记处(即'cat'在那里,'b'在这里)并且在我的情况下我需要接受中间的'b'。 / p>
P.S。 我实际上要做的是匹配一个表达式,其最外层的规则是函数调用。 E.g。
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
。
答案 0 :(得分:1)
是的,没有回溯,因此您已正确识别问题。我认为解决方案是列出有效的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
。
答案 1 :(得分:0)
这个怎么样?
local final = P'b' * P(-1)
local patt = (S'ab' - final)^0 * final
模式final
是我们在字符串末尾所需要的。
模式patt
与集合'ab'匹配,除非后面跟着最后的序列。然后它断言我们有最后的序列。这样可以阻止最后的'b'被吃掉。
这并不能保证我们得到任何一个(但问题中的模式都没有)。