-3

正規表現自体を手伝ってください。私はそれを学んでいます。交換用のコードは必要ありません。

私はVS2008(C ++)でwxWidget2.8.12に取り組んでいます。TEST_STRINGが浮動小数点数かどうかを確認したいのですが。(-0.1、、0.1など1)。表現自体は正しいと思いますので、ツールで確認しました。wxWidgetを間違えますか?

wxString tmpStr = TEST_STRING;
wxRegEx reNegativeFloatNum(_("^[-]?[0-9]*\\.?[0-9]+$"));
bool tmp = reNegativeFloatNum.Compile(tmpStr);
     tmp = tmp && reNegativeFloatNum.IsValid();
if ( tmp && reNegativeFloatNum.Matches(tmpStr))
{
    //Do something
}
else
{
    //Do something else
}

私の本当の質問は、なぜ正規表現が機能しないのかということです。'a'-'Z'を入力すると、Matches()は'true'を返します。誰か知ってる?正規表現を学びたいだけです。

4

4 に答える 4

1

OPは本当に正規表現を使用したいので、詳細に調べたところ、元の正規表現はうまく機能しました。_()正規表現文字列を前後に使用する必要がないことに注意してください。これは、翻訳する必要があるものではなく (_は の短い同義語ですwxTRANSLATE()) Compile()、ctor によって既に呼び出されているためです。したがって、ここに短いバージョンがあります:

#include <wx/init.h>
#include <wx/regex.h>

int main(int argc, char **argv)
{
    wxInitializer init;
    if ( !init.IsOk() ) {
        puts("Failed to initialize wxWidgets.");
        return 1;
    }

    wxRegEx re("^[-]?[0-9]*\\.?[0-9]+$");
    return re.Matches(argv[1]);
}

そして、期待どおりに動作します:

    % ./a.out 123 || echo matches
    matches
    % ./a.out a-Z || echo matches
    <<<nothing>>>
于 2012-08-22T09:57:54.813 に答える
0

2つの方法はどちらも機能します:
方法1:

wxRegEx re;
bool tmp = re.Compile(wxT("^[-]?[0-9]*\\.?[0-9]+$"));
if ( tmp && re.Matches(StrToBeTested))
{
    //Do sth.
}

方法2:

wxRegEx re(wxT("^[-]?[0-9]*\\.?[0-9]+$"));
if (re.Matches(StrToBeTested))
{
    //Do sth.
}

VZの回答によると、メソッド2で再度コンパイルする必要はありません。動作します。
wxRegEx::Compileのパラメータでばかげた間違いをしました。すべての返信をありがとう。

于 2012-08-23T06:11:17.103 に答える
0

ravenspoint が書いたように、このようなものには正規表現は必要ありません (ただし、何らかの理由で、本当に必要な場合は正規表現を使用することもできます)。

wxWidgets で必要なことを行う最も簡単な方法は次のとおりです。

double num;
if ( tmpStr.ToDouble(&num) ) {
    if ( num < 0 )
        ...
}
//else: it's not a number at all
于 2012-08-21T12:28:07.560 に答える
0

このタスクに正規表現を使用する必要はありません。数値を変換してテストし、負の数値に変換されたかどうかを調べます。

if ( atof( tmpStr.c_str() < 0 ) { 
  // negative number
} else {
  // positive or not a number
}
于 2012-08-21T11:37:43.357 に答える