web-dev-qa-db-ja.com

ダブルの正規表現

私はこの正規表現を持っています"^[0-9]+\.?[0-9]*$")は、ビジュアルC++で2進数または整数に一致しますが、機能しないようです。何か案は?

これは私がコードを適用する方法です:

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

言い方によると、正規表現に問題はありません。それは、脱出のせいです。 _\_文字はC++文字列のエスケープ文字でもあるため、ダブルエスケープする必要があります。

さらに、この正規表現は_1._が有効な浮動ポインタ番号であると考えるEdgeケースがあります。そのため、その可能性を排除する/^[0-9]+(\\.[0-9]+)?$を使用したほうがよい場合があります。

12
Benj

上記の正規表現は、有効な数値ではない「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);

したがって、ゼロ文字で簡単に終了する可能性があります。そしてもちろん、これらはすべてdouble自体ではなく、固定小数点表現です。倍精度数は、-0.000123の代わりに-1.23e-4と書くこともできます。

4
ThatsMe

たぶん、直接的な答えではなく、役に立つ情報だけです。正規表現:

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"

最初のものは、C++のdoubleタイプの有効な値のように見えます。 double test = +009.e+10は問題ありません。

Ideone.comで再生: https://ideone.com/ooF8sG

0
don_vanchos