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

时间:2010-12-18 18:27:51

标签: c++ regex

我正在加载一个包含

行的.obj文件
  

vn 8.67548e-017 1 -1.55211e-016

表示顶点法线。如何检测它们并将它们带到双重符号?

6 个答案:

答案 0 :(得分:5)

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

-?[\d.]+(?:e-?\d+)?

转换为数字可以这样做:String in scientific notation C++ to double conversion,我想。

正则表达式是

-?      # 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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

standard library function strtod正好处理指数分量(atof也是如此,但strtod允许您区分失败的解析和解析零值。

答案 3 :(得分:2)

如果您可以确定double的格式是科学的,您可以尝试以下内容:

  string inp("8.67548e-017");
  istringstream str(inp);
  double v;
  str >> scientific >> v;
  cout << "v: " << v << endl;

如果要检测是否存在该格式的浮点数,那么上面的正则表达式就可以了。

编辑:实际上不需要scientific操纵器,当您以双精度流式传输时,它会自动为您处理(无论是固定的还是科学的)

答案 4 :(得分:0)

这不是你要求的,因为它不是Perl(gak),它是一个常规定义而不是正则表达式,但它是我用来识别C浮点文字的扩展(扩展名是允许在数字字符串中使用“_”),如果你愿意,我相信你可以把它转换成一个不可读的正则表达式:

/* floats: Follows ISO C89, except that we allow underscores */
let decimal_string = digit (underscore? digit) *
let hexadecimal_string = hexdigit (underscore? hexdigit) *

let decimal_fractional_constant =
  decimal_string '.' decimal_string?
  | '.' decimal_string

let hexadecimal_fractional_constant =
  ("0x" |"0X")
  (hexadecimal_string '.' hexadecimal_string?
  | '.' hexadecimal_string)

let decimal_exponent = ('E'|'e') ('+'|'-')? decimal_string
let binary_exponent = ('P'|'p') ('+'|'-')? decimal_string

let floating_suffix = 'L' | 'l' | 'F' | 'f' | 'D' | 'd'
let floating_literal =
  (
    decimal_fractional_constant decimal_exponent? |
    hexadecimal_fractional_constant binary_exponent?
  )
  floating_suffix?

C格式专为编程语言而非数据而设计,因此它可能支持您的输入不需要的内容。

答案 5 :(得分:0)

我尝试了其他一些解决方案无济于事,所以我想出了这个。

       ^(-?\d+)\.?\d+(e-|e\+|e|\d+)\d+$

Regular expression visualization

Debuggex Demo

任何匹配的东西都被认为是有效的科学记谱法。

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

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

编辑:我以前的正则表达式有点儿,所以我用上面的那个代替了它。