正则表达式为浮点字面值

时间:2014-06-16 18:50:18

标签: regex

我正在寻找

的十进制浮点字面值的正则表达式
  • 与整数文字不匹配
    • 123无效
  • 点前面不需要数字
    • .123有效
  • 点后需要一个数字
    • 1.无效
    • 1.1有效
  • 允许在第一个位置的任何位置使用下划线
    • .1_2有效
    • _.12无效
    • 1_2.0有效
  • 允许指数指标
    • 1e2有效
    • 1.1e2有效

请注意,这不是重复的Regex for positive float numbers,因为该问题未提及浮动的指数部分,这为答案增加了大量复杂性

1 个答案:

答案 0 :(得分:4)

由于regexp的每个元素都是简单明了的,因此以下是它们的定义:

  • 整数部分为[0-9][0-9_]*
  • 小数部分为\.[0-9][0-9_]*
  • 指数部分为[eE][+-]?[0-9][0-9_]*

接下来,枚举有效和无效的分组:

|int|dec|exp|->|valid|
|===|===|===|==|=====|
| no| no| no|->| no  |
| no| no|yes|->| no  |
| no|yes| no|->| yes |
| no|yes|yes|->| yes |
|yes| no| no|->| no  |
|yes| no|yes|->| yes |
|yes|yes| no|->| yes |
|yes|yes|yes|->| yes |

一些重复的正则表达式并不算太糟糕,但12个重复版本太多了。这可以通过将表格简化为尽可能最小的形式来解决:

|int|dec|exp|->|valid|
|===|===|===|==|=====|
|yes| ? |yes|->| yes |
| ? |yes| ? |->| yes |

?表示该表达式是否存在,匹配仍然有效。

替换子regexps:

# Row 1
(?:[0-9][0-9_]*+)
(?:\.[0-9][0-9_]*)?
(?:[eE][+-]?[0-9][0-9_]*)

| # Row 2
(?:[0-9][0-9_]*)?
(?:\.[0-9][0-9_]*)
(?:[eE][+-]?[0-9][0-9_]*)?

,如果您喜欢混淆代码,也可以像

一样编写
(?:[0-9][0-9_]*)(?:\.[0-9][0-9_]*)?(?:[eE][+-]?[0-9][0-9_]*)|(?:[0-9][0-9_]*)?(?:\.[0-9][0-9_]*)(?:[eE][+-]?[0-9][0-9_]*)?