【发布时间】:2020-03-12 15:14:25
【问题描述】:
我正在尝试创建匹配从-2,147,483,648 to 2,147,483,647 开始的整数值的正则表达式。正如我注意到的,JFlex 不支持\w, \d, ^, $。
我试图在 flex 文件中写一些这样的正则表达式。它编译,但不工作。
INTEGER = (0|[1-9]{1}[0-9]{0,8}|[1]{1}[0-9]{1,9}|[-]{1}[2]{1}([0]{1}[0-9]{8}|[1]{1}([0-3]{1}[0-9]{7}|[4]{1}([0-6]{1}[0-9]{6}|[7]{1}([0-3]{1}[0-9]{5}|[4]{1}([0-7]{1}[0-9]{4}|[8]{1}([0-2]{1}[0-9]{3}|[3]{1}([0-5]{1}[0-9]{2}|[6]{1}([0-3]{1}[0-9]{1}|[4]{1}[0-8]{1}))))))))|(\+)?[2]{1}([0]{1}[0-9]{8}|[1]{1}([0-3]{1}[0-9]{7}|[4]{1}([0-6]{1}[0-9]{6}|[7]{1}([0-3]{1}[0-9]{5}|[4]{1}([0-7]{1}[0-9]{4}|[8]{1}([0-2]{1}[0-9]{3}|[3]{1}([0-5]{1}[0-9]{2}|[6]{1}([0-3]{1}[0-9]{1}|[4]{1}[0-7]{1})))))))))
有没有办法做到这一点?或者也许有一些更简单的方法来创建这样的正则表达式?
编辑:
我从这个问题中找到了正则表达式: Regex for a valid 32-bit signed integer
正则表达式是:
\b([0-9]{1,9}|1[0-9]{9}|2(0[0-9]{8}|1([0-3][0-9]{7}|4([0-6][0-9]{6}|7([0-3][0-9]{5}|4([0-7][0-9]{4}|8([0-2][0-9]{3}|3([0-5][0-9]{2}|6([0-3][0-9]|4[0-7])))))))))\b|-\b([0-9]{1,9}|1[0-9]{9}|2(0[0-9]{8}|1([0-3][0-9]{7}|4([0-6][0-9]{6}|7([0-3][0-9]{5}|4([0-7][0-9]{4}|8([0-2][0-9]{3}|3([0-5][0-9]{2}|6([0-3][0-9]|4[0-8])))))))))\b
我还删除了.bnf 和.flex 中的\b。
这个正则表达式在.bnf 文件中编译得很好,.flex 生成的类没有错误,但没有任何工作。我在两个在线测试中都测试了这个正则表达式:
但在测试中一切都很好。我在哪里做错了?
【问题讨论】:
-
使用
{1}有什么意义?据我所知,这是 100% 的噪音。 (并且写[1]而不是1也是边缘化的。) -
@rici 感谢您的评论。我删除了它,但仍然没有任何效果。
标签: regex flex-lexer bnf jflex