我正在加载一个包含
行的.obj文件vn 8.67548e-017 1 -1.55211e-016
表示顶点法线。如何检测它们并将它们带到双重符号?
答案 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+$
任何匹配的东西都被认为是有效的科学记谱法。
请注意:此接受e+
,e-
和e
;如果您不想接受e
,请使用此^(-?\d+)\.?\d+(e-|e\+|\d+)\d+$
我不确定它是否适用于c ++,但在c#中,您可以在正则表达式中的(?i)
和^
之间添加(-
,以切换内联案例-insensitivity。没有它,声明为1.05E+10
的指数将无法被识别。
编辑:我以前的正则表达式有点儿,所以我用上面的那个代替了它。