我在lex中需要积极的lookbehind断言(flex 2.5.35)。在调查文档后,我没有看到直接的方法来做到这一点。它有类似于前瞻断言(r / s语法)的东西,但不是后瞻性的。达到同样效果的最佳方法是什么?
这是一个例子:假设我在扫描仪规范文件中有以下规则:
a printf("matched a ");
b printf("matched b ");
c printf("matched c ");
d printf("matched d ");
我如何匹配'b'后面的'd'和'b'本身,以便在'abd'的输入上得到:
matched a matched b matched d following b
但对于字符串'acd'
matched a matched c matched d
规则:
bd printf("matched d following b ");
显然不起作用,因为它消耗了b;为'abd'输出:
matched a matched d following b
如果我有pcre lookbehinds,我可以写:
(?<=b)d printf("matched d following b ");
一切都会好的,但是lex不支持这个。
答案 0 :(得分:1)
如果你只有一个先行断言,我可以想到两种可能性。
反转您的字符串,并搜索您的倒置图案。通常在您的模式出现之前通常是什么。
我认为对于一些正则表达式的口味,可以从右向左解析,也许这可以帮助你和你的前瞻。
否则你应该发布一些示例字符串以及你期望的结果,也许它可以在不使用后面断言的情况下实现。
答案 1 :(得分:1)
您可以使用start conditions实现所需的功能,但代价是更复杂的扫描仪。启动条件允许您根据之前匹配的内容有条件地启用规则。这是一个例子:
%x matched_b
%%
<INITIAL,matched_b>{
a { printf("matched a\n"); BEGIN(INITIAL); }
b { printf("matched b\n"); BEGIN(matched_b); }
c { printf("matched c\n"); BEGIN(INITIAL); }
}
d printf("matched d\n");
<matched_b>d { printf("matched d following b\n"); BEGIN(INITIAL); }
使用此扫描仪我得到:
$ echo abcd | ./5615080
matched a
matched b
matched c
matched d
$ echo abdd | ./5615080
matched a
matched b
matched d following b
matched d
答案 2 :(得分:0)
对于pcre,语法背后是:
(?<= ... )
为积极的
(?<! ... )
否定
并且pcre需要固定长度看后面(正面或负面)。
如果lex拥有它们,它可能就是这种形式。