关于科学记数法的正则表达式?

and*_*and 7 c++ regex

我正在加载一个有类似行的.obj文件

vn 8.67548e-017 1 -1.55211e-016

对于顶点法线.如何检测它们并将它们带到双重符号?

Tom*_*lak 6

一个效果很好的正则表达式是:

-?[\d.]+(?:e-?\d+)?
Run Code Online (Sandbox Code Playgroud)

转换为数字可以这样完成:科学记数法中的字符串C++来双转换,我想.

正则表达式是

-?      # an optional -
[\d.]+  # a series of digits or dots (see *1)
(?:     # start non capturing group
  e     # "e"
  -?    # an optional -
  \d+   # digits
)?      # end non-capturing group, make optional
Run Code Online (Sandbox Code Playgroud)

**1)这不是100%正确,技术上只有一个点,在它之前只有一个(或没有)数字.但实际上,这不应该发生.所以正则表达式是一个很好的近似值,误报应该是不太可能的.随意使正则表达式更具体.*

  • 我建议将 `[\d.]+` 分解为 `\d+\.\d+` 以防止错误匹配。如果您不需要小数点之前和/或之后的数字,请使用 `\d*`。 (4认同)

Ash*_*sha 6

您可以使用以下方式识别科学值:-?\d*\.?\d+e[+-]?\d+正则表达式。


Xtr*_*ity 6

我尝试了许多其他解决方案,但都无济于事,所以我想出了这个。

       ^(-?\d+)\.?\d+(e-|e\+|e|\d+)\d+$
Run Code Online (Sandbox Code Playgroud)

正则表达式可视化

调试演示

任何匹配的内容都被视为有效的科学记数法。

请注意:这接受e+,e-e; 如果您不想接受e,请使用:^(-?\d+)\.?\d+(e-|e\+|\d+)\d+$

我不确定它是否适用于 c++,但在 c# 中,您可以在正则表达式中的和(?i)之间添加,以切换内联不区分大小写。没有它,声明类似的指数将无法被识别。^(-1.05E+10

编辑:我之前的正则表达式有点问题,所以我用上面的正则表达式替换了它。


Ben*_*igt 3

标准库函数strtod可以很好地处理指数分量(也可以atof,但strtod允许您区分失败的解析和解析值零)。