2010-12-18 894 views

回答

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

我建议将'[d。] +'上移到'\ d + \。\ d +'以防止错误匹配。如果在小数点之前和/或之后不需要数字,则使用'\ d *'。 – marcog 2010-12-18 18:38:59

+0

IS不会匹配'5.5.5.5.5.5.5.5.5.5.5.5.5' – 2010-12-18 18:39:48

+0

@Martin:是的。问题是:这样的价值可能会发生吗?如果是的话,正则表达式可以很容易地做出更具体的。我的猜测是,在这种情况下'5.5.5.5'的情况是不太可能的。 – Tomalak 2010-12-18 18:43:19

2

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

+1

请不要使用'{0,1}'-use'?'。前者更长,更清晰,并且具有相同的效果。 – 2010-12-18 18:39:58

+0

'{0,1}'可以替换为'?'。但是,为什么你要小数点是可选的?这不允许负数。它也错误地匹配可能不希望的'.0'。 – marcog 2010-12-18 18:41:02

+0

@marcog:可能是因为根据示例数据,小数点是可选的。第三场只是“1”。 – 2010-12-18 18:45:07

2

如果你能肯定的是,双格式是科学的,你可以尝试类似如下:

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

如果要检测是否有该格式的浮点数,然后上面的正则表达式可以解决这个问题。

编辑:其实不需要scientific手,当你在双流,它会自动为你做的处理(无论是固定的或科学)

+0

我认为这是去C++的方式。摆弄有时候工作正常的正则表达式,有时不会成为我理想的方式。相反,这将粗糙的部分委托给stl的stringstream。这是检查有效科学格式的更高级版本。 – 2015-04-10 20:04:05

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格式是专为编程langu年龄不是数据,所以它可能支持你的输入不需要的东西。

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),切换在线不区分大小写。没有它,像1.05E+10这样宣布的指数将无法被识别。

编辑:我以前的正则表达式是一个小错误,所以我用上面的代码替换了它。