如何使用正则表达式检测浮点数

Kel*_*nch 14 regex floating-point

什么是处理浮点数的好正则表达式(即像Java的Float)

答案必须符合以下目标:

 1) 1.  
 2) .2   
 3) 3.14  
 4) 5e6  
 5) 5e-6  
 6) 5E+6  
 7) 7.e8  
 8) 9.0E-10  
 9) .11e12  
Run Code Online (Sandbox Code Playgroud)

总之,它应该

  • 忽略先前的迹象
  • 要求小数点左边的第一个字符为非零
  • 允许小数点两边有0位或更多位数
  • 允许没有小数点的数字
  • 允许科学记数法
  • 允许大写或小写'e'
  • 允许积极或消极的指数

对于那些想知道的人,是的,这是一个家庭作业问题.我们在编译器的CS课程中收到了这个作业.我已经把我的答案交给了班级,并将其作为这个问题的答案发布.

[Epilogue]我的解决方案没有得到充分的信任,因为它没有处理小数点左边的超过1位数.赋值确实提到了处理Java浮点数,即使这些示例都没有小数点左边的1位数.我会在自己的帖子中发布已接受的答案.

Ale*_*lli 23

只需使小数点和E-then-exponent部分可选:

[1-9][0-9]*\.?[0-9]*([Ee][+-]?[0-9]+)?
Run Code Online (Sandbox Code Playgroud)

我不明白你为什么不想领导[+-]?一个可能的标志,但是,无论如何! - )

编辑:实际上可能没有小数点左边的数字(在这种情况下,我想必须有小数点后面的1+位数!),所以显然需要一个竖线(替代):

(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))([Ee][+-]?[0-9]+)?
Run Code Online (Sandbox Code Playgroud)

  • @Alex:如果它是表达式的一部分,他可能不想捕获符号,如"5-2.5".如果你像编写编译器那样对事物进行标记,那就是预期的. (4认同)
  • 请注意,这与`.x`或`0.x`形式的任何内容都不匹配. (2认同)
  • 此模式不匹配"0"或"0.7".这是我的修订:` - ?(0(\.\ d*)?|([1-9]\d*\.?\ d*)|(\.\ d +))([Ee] [+ - ] ?\ d +)?` (2认同)

Kel*_*nch 7

[这是教授的答案]

限定:

N = [1-9]
D = 0 | N
E = [eE] [+ - ]?D +
L = 0 | (ND*)

然后浮点数可以匹配:

((L.D*| .D +)E?)| (LE)

使用D +而不是L,并且前缀为[+ - ]?也是可以接受的.

一个常见的错误就是写D*.D*,但这只能匹配'.'.

[编辑]
有人询问一个主要标志; 我应该问他为什么被排除但从未有机会.由于这是关于语法的讲座的一部分,我的猜测是它要么使问题更容易(不太可能),要么在解析问题集的地方有一个小细节,使浮点值,无论符号,是重点(可能).

如果您正在解析表达式,例如

-5.04e-10 + 3.14159E10

浮点值的符号是要应用于值的操作的一部分,而不是数字本身的属性.换一种说法,

减法(5.04e-10)
加(3.14159E10)

形成表达式的结果.虽然我确信数学家可能会争论这一点,但请记住这是一篇关于解析的讲座.