【问题标题】:wxWidget, regular expression, wxRegEx, check float numberwxWidget,正则表达式,wxRegEx,检查浮点数
【发布时间】:2012-08-16 16:22:06
【问题描述】:

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

我正在使用 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() 返回“真”。有谁知道吗?我只是想学习正则表达式。

【问题讨论】:

  • 您的正则表达式表示它可以是负数或正数([-] 后的问号),但文本和主题仅表示负数。是哪个?
  • 您正在撰写有关负浮点数的文章,但在您的示例中出现了两种类型的数字 - 正数和负数。您的正则表达式也匹配正数和负数。
  • 如果用户不输入'-',我会自动为他添加'-'。
  • 我真正的问题是为什么正则表达式不起作用?如果我输入“a”-“Z”,则 Matches() 返回“真”。有谁知道吗?我只是想学习正则表达式。谢谢。
  • Albert,您被否决了,因为 a) 您的问题与 wxWidgets 无关,尽管您已将其标记为 wxWidgets。 b) 有很多关于正则表达式的书籍和在线教程,您似乎都没有费心去阅读。这可能看起来很刻薄,但这里的人们希望您在提问之前准确地标记您的问题并进行一些基础研究。如果您修复了标签并显示出尝试找到问题答案的迹象,那么人们将很乐意为您提供帮助。

标签: regex wxwidgets


【解决方案1】:

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

if ( atof( tmpStr.c_str() < 0 ) { 
  // negative number
} else {
  // positive or not a number
}

【讨论】:

    【解决方案2】:

    正如 ravenspoint 所写,对于这样的事情,您确实不需要正则表达式(当然,如果出于某种原因,您也可以使用它们)。

    在 wxWidgets 中做你想做的最简单的方法是

    double num;
    if ( tmpStr.ToDouble(&num) ) {
        if ( num < 0 )
            ...
    }
    //else: it's not a number at all
    

    【讨论】:

      【解决方案3】:

      由于 OP 真的想使用正则表达式,我详细查看了它,原始的正则表达式对我来说很好用。请注意,您不需要在正则表达式字符串周围使用 _(),因为这不是您需要翻译的内容(_wxTRANSLATE() 的简短同义词)并且 Compile() 已经被医生。所以这里有一个较短的版本:

      #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>>>
      

      【讨论】:

      • 非常感谢。在你的帮助下,我解决了我的错误是我误用了方法 wxRegEx::Compile()。
        由于我使用VC++,所以必须使用_("") 或wxT(""),否则会出现编译错误。
      • _() 和 wxT() 相同,请阅读手册了解区别。
      【解决方案4】:

      这两种方法都有效:
      方法一:

      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 的参数上犯了一个愚蠢的错误。感谢所有回复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多