-3

请帮助我处理正则表达式本身。我正在学习它。我不需要替换代码。

我正在使用 VS2008 (C++) 开发 wxWidget 2.8.12。我想检查 TEST_STRING 是否是浮点数。(-0.10.11)。我认为表达式本身是正确的,我通过工具检查过。我对 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() 返回“真”。有谁知道吗?我只是想学习正则表达式。

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

您不需要为此任务使用正则表达式。转换数字并测试它是否转换为负数。

if ( atof( tmpStr.c_str() < 0 ) { 
  // negative number
} else {
  // positive or not a number
}
于 2012-08-21T11:37:43.357 回答
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

两种方法都有效:
方法1:

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

方法二:

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

根据VZ的回答,方法2不需要再次编译。它确实有效。
我只是在 wxRegEx::Compile 的参数上犯了一个愚蠢的错误。感谢所有回复。

于 2012-08-23T06:11:17.103 回答