微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

lex中的正则表达式

如何解决lex中的正则表达式

我只想在整行与模式匹配时打印。 但是,即使该行的一部分与模式匹配,它也会打印出来。 我应该如何使用正则表达式?

解决方法

你需要做两件事:

  1. 坚持模式匹配到行尾;

     ((100+1+)|(01))+\n      {printf("%s\n",yytext);}
    

    \n 匹配行尾字符。)

  2. 包括一个替代模式来捕捉与第一个模式不匹配的行:

     .*\n?     { /* Maybe do something here */
    

您需要按此顺序放置这两个规则,因为第二个规则将匹配任何行,无论正确与否。但是,如果第一个模式与同一行匹配,则将使用该模式。

?第二条规则的末尾是使换行符可选。在 (f)lex 中,. 匹配除换行符以外的任何字符,因此您可能认为 .*\n 将匹配任何行。确实会。但是,文本文件中的最后一行可能会(虽然不完全正确)缺少换行符。为了涵盖这种情况,我们使用 .*\n?。 (F)lex 规则从不匹配空字符串,并且模式总是尽可能匹配,因此该规则可以在没有换行符的情况下匹配的唯一时间是要匹配的字符是否正好在文件末尾,没有换行符.

注意 .*\n.*$ 之间的区别。如果模式以 $ 结尾,(f)lex 将只使用下一个字符是换行符的规则。但是 $ 不匹配换行符,因此它仍将在输入流中等待匹配。如果您使用 $ 而不是 \n,您将需要另一个规则来匹配(和丢弃)换行符。但这毕竟可能是您想要的,因为 flex 总是先读取一个字符,即使它不需要下一个字符知道要做什么。因此,如果您明确地将 \n 与我上面建议的规则相匹配,您会发现您的扫描仪在交互使用中的响应速度并不快;消息将被延迟到下一行被读取。

,

lex 中的默认规则是打印输出;所以如果你添加一行:

。 { }

最后,您将防止它与未清洗的图案相呼应。 接下来,如果您希望您的模式仅限于一行;您需要在规则中包含换行符:

((100+1+)|(01))+\n {printf("%s\n",yytext);}

但是请注意,我假设您的换行符应该放在何处;它也可以是:

((100+1+)|(01))\n+ {printf("%s\n",yytext);}

完全不同的效果。

Lex 是一个锋利的工具。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。