匹配字符串与LPeg中的特定结尾

时间:2015-07-17 07:50:28

标签: lua lpeg

我正在尝试使用a和b的组合捕获字符串,但总是以b结尾。换句话说:

local patt = S'ab'^0 * P'b'

匹配aaabbbabb但不匹配aaabba。但上述情况并不匹配。这是因为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

2 个答案:

答案 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'被吃掉。

这并不能保证我们得到任何一个(但问题中的模式都没有)。