【问题标题】:C++ Simple use of regexC++ 正则表达式的简单使用
【发布时间】:2011-12-02 21:44:50
【问题描述】:

我只是想弄乱并熟悉在 c++ 中使用正则表达式。 假设我希望用户输入以下内容:###-$$-###,使 #=0-9 之间的任何数字和 $=0-5 之间的任何数字。这是我的想法:

regex rx("[0-9][0-9][0-9]""\\-""[0-5][0-5]")

这不是确切的代码,但这是检查用户输入是否为有效数字字符串的一般思路。但是,假设我不允许以 0 开头的数字,因此:099-55-999 是不可接受的。我怎样才能检查类似的东西并输出无效?谢谢

【问题讨论】:

  • 我不确定要问什么?你能试着澄清一下你的问题,理查德吗?
  • make #=... 是什么意思?您需要提供输入/输出。
  • 我注意到你用 VS2010 标记。您是否考虑过使用 std::regex?它是标准库的一部分,我认为它基于 boost 的实现。如果您在项目中仅针对正则表达式引入 boost 依赖项,您可能希望放弃 boost 以支持标准标头。

标签: c++ regex visual-studio-2010 boost-regex


【解决方案1】:
[0-9]{3}-[0-5]{2}-[0-9]{3}

匹配以 0 到 9 之间的三位数字开头的字符串,后跟一个短划线,后跟 0 到 5 之间的两位数字,后跟一个短划线,后跟 0 到 9 之间的三位数字。

这就是你要找的吗?这是非常基本的正则表达式。我建议你看看good tutorial

编辑:(在您更改问题后):

[1-9][0-9]{2}-[0-5]{2}-[0-9]{3}

除了不允许 0 作为第一个字符之外,将与上述相同。

【讨论】:

  • 这几乎是我即将发布的确切答案:(
  • 这个人最多在 1 分钟内回答。 :) 如果他睡着了,我们也可以回答 :)
【解决方案2】:
std::tr1::regex rx("[0-9]{3}-[0-5]{2}-[0-9]{3}");

您说的是在 c++ 中使用 tr1 正则表达式,而不是托管 c++?如果是这样,请转到 here 那里解释了这些内容。

另外,您应该知道,如果您使用 VS2010,您不再需要用于正则表达式的 boost 库。

【讨论】:

  • 他说的是boost::regex,我相信这是标准正则表达式的基础。
  • @AJG85 不,他不久前发布了类似的问题。他正在参加 MSVS 2010。
  • 对,它的基于 boost::regex,但是因为tr1将来某个时候会成为标准库的一部分,所以在VS2010中他们已经实现了所有tr1的东西tr1 命名空间,因为它实际上还不是标准的一部分。
  • @FailedDev:那么他要么不知道 std::regex,要么它被错误地标记为 boost-regex。
【解决方案3】:

试试这个:

#include <regex>
#include <iostream>
#include <string>

int main()
{
    std::tr1::regex rx("\\d{3}-[0-5]{2}-\\d{3}");
    std::string s;
    std::getline(std::cin,s);
    if(regex_match(s.begin(),s.end(),rx))
    {
        std::cout << "Matched!" << std::endl;
    }
}

有关解释,请查看@Tim 的答案。 注意数字元字符的双 \

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多