1

说我有一些规则和行动,就像这样

,                   { do something; }
\.                  { do_something; }
\(                  { do_someting; }
\)                  { do_something); }
:                   { do_something; }
...

每当我匹配左边的规则时,右边的动作就会被调用。但是,如果我想匹配其他所有内容怎么办?我怎么能这样做?

使用类似的东西

.*          { do_something; }

不起作用,因为它也适用于上述规则。

4

1 回答 1

2

根据lex 规范

在模式匹配期间,lex 将搜索模式集以寻找最长的可能匹配项。在匹配相同字符数的规则中,应选择最先给出的规则。

所以我会选择:

.  { do_something; }

...并将其作为最后一条规则。

这将匹配单个字符,但换行符除外(“<newline> 不应与句点运算符匹配”)。如果您还想匹配换行符:

.|\n  { do_something }

最后,如果您实际上不想使用该字符,则需要一个与空字符串匹配的扩展正则表达式 (ERE)。你可以试试:

.{0}  { do_something }

当我阅读 lex 和 ERE 的规范时,我相信这应该有效,但如果它在某处引起了一些错误,我不会感到惊讶 :-)

于 2012-09-03T01:27:50.930 回答