【问题标题】:JFlex signed integer regular expressionJFlex 有符号整数正则表达式
【发布时间】: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 生成的类没有错误,但没有任何工作。我在两个在线测试中都测试了这个正则表达式:

flex regex test

regex test

但在测试中一切都很好。我在哪里做错了?

【问题讨论】:

  • 使用{1}有什么意义?据我所知,这是 100% 的噪音。 (并且写 [1] 而不是 1 也是边缘化的。)
  • @rici 感谢您的评论。我删除了它,但仍然没有任何效果。

标签: regex flex-lexer bnf jflex


【解决方案1】:

好吧,正确的正则表达式是:

([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])))))))))|-([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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多