21

我有这个正则表达式"^[0-9]+\.?[0-9]*$")来匹配视觉 C++ 中的双数或整数,但它似乎不起作用。有任何想法吗?

这就是我应用代码的方式:

if (System::Text::RegularExpressions::Regex::IsMatch(e0, "^[0-9]+\.?[0-9]*$")){
     e0_val = System::Convert::ToDouble(e0);
}
4

5 回答 5

20

正则表达式本身没有任何问题,这是您的逃避问题。您需要对该\字符进行双重转义,因为这也是 C++ 字符串转义字符。

另外还有一个边缘情况,这个正则表达式会认为这1.是一个有效的浮点数。/^[0-9]+(\\.[0-9]+)?$因此,消除这种可能性可能会更好。

于 2012-05-09T13:22:26.120 回答
17

上面的正则表达式并不完美,因为它接受不是有效数字的“09”。更好的表达方式是:

"^(-?)(0|([1-9][0-9]*))(\\.[0-9]+)?$"

在哪里:

1. is an optional negative sign;
2. is zero or a valid non-zero integer;
4. is the optional fracture part;

理论上,断裂部分应该写成“(\.[0-9]*[1-9])?” 相反,因为数字不能有尾零。在实践中,源字符串可能是使用固定位数创建的,例如:

printf("%.1f", x);

所以它可能很容易以零字符结束。当然,这些都是定点表示,而不是双打本身。双精度数也可以写为 -1.23e-4 而不是 -0.000123。

于 2017-11-15T10:28:08.953 回答
4

/^[0-9]+.[0-9]+$:将其用于双打。

接受 123.123 类型。

于 2019-08-08T12:11:52.237 回答
2

也许不是直接的答案,只是有用的信息。正则表达式:

std::regex rx(R"(^([+-]?(?:[[:d:]]+\.?|[[:d:]]*\.[[:d:]]+))(?:[Ee][+-]?[[:d:]]+)?$)");

匹配字符串:

"1", "0", "10",
"1000.1", "+1",
"+10", "-10", "1.",
".1", "1.1", "+1.",
"-1.", "+.1", "-.1",
"009", "+009", "-009",
"-01e0", "+01E0", "+1e-1",
"+1e+1", "+1.e1", "1E1",
"1E+1", "0.001e-12", "0.111111111111111"

并且不匹配下一个字符串:

".", "1a", "++1",
"+-1", "+", "-.",
"-", "--1.", "1.e.1",
"1e.1", "0+.e0"

double第一个看起来像是C++中类型的有效值,例如double test = +009.e+10是 OK。

在 ideone.com 中播放:https ://ideone.com/ooF8sG

于 2019-06-07T23:13:48.460 回答
0
(\d+)?\.(\d+)?

上面的正则表达式适用于“45.5”“12”等双打。, ".12"

于 2020-12-14T20:07:06.553 回答