我正在寻找
的十进制浮点字面值的正则表达式123
无效.123
有效1.
无效1.1
有效.1_2
有效_.12
无效1_2.0
有效1e2
有效1.1e2
有效请注意,这不是重复的Regex for positive float numbers,因为该问题未提及浮动的指数部分,这为答案增加了大量复杂性
答案 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_]*)?