正则表达式验证失败,而egrep验证就好了

时间:2012-05-14 19:39:10

标签: c++ regex c++11 grep

我正在尝试使用正则表达式来验证字符串,所以在我再进一步之前让我首先解释一下字符串是什么样的:可选的数字后跟一个'X'和一个可选的('^'跟随一个或多个数字)。

以下是一些exmaples:“2X”,“X”,“23X ^ 6”符合模式,而字符串如“X ^”,“4”,“foobar”,“4X ^”,“4X44”don'吨。

现在我在哪里:使用'egrep'和“^ [0-9] {0,} \ X(\ ^ [0-9] {1,}} $”正则表达式我可以很好地验证这些字符串但是,当使用C ++ 11正则表达式库在C ++中尝试此操作时,它会失败。

这是我用来验证这些字符串的代码:

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

int main()
{
    std::regex r("^[0-9]{0,}\\X(\\^[0-9]{1,})$",
                 std::regex_constants::egrep);
    std::vector<std::string> challanges_ok {"2X", "X", "23X^66", "23X^6",
                                            "3123X", "2313131X^213213123"};
    std::vector<std::string> challanges_bad {"X^", "4", "asdsad", " X",
                                             "4X44", "4X^"};
    std::cout << "challanges_ok: ";
    for (auto &str : challanges_ok) {
        std::cout << std::regex_match(str, r) << " ";
    }

    std::cout << "\nchallanges_bad: ";
    for (auto &str : challanges_bad) {
        std::cout << std::regex_match(str, r) << " ";
    }
    std::cout << "\n";

    return 0;
}

我做错了什么或者我错过了什么?我正在根据GCC 4.7进行编译。

2 个答案:

答案 0 :(得分:4)

您的正则表达式无法使'^'后跟一个或多个数字可选;将其改为:
"^[0-9]*X(\\^[0-9]+)?$"

另请注意,this page表示GCC对<regex>的支持只是部分支持,因此std::regex可能根本不起作用(在这种情况下,“部分”显然意味着'已损坏' );您是否尝试过Boost.XpressiveBoost.Regex作为完整性检查?

答案 1 :(得分:1)

  

可选的位数后跟一个&#39; X&#39;和一个可选的(&#39; ^&#39;后跟一个或多个数字)。

好的,您的代码中的正则表达式与该描述不匹配,原因有二:您在X上有一个额外的反斜杠,以及&#39; ^数字&#39;部分不是可选的。你想要的正则表达式是:

^[0-9]{0,}X(\^[0-9]{1,}){0,1}$

这意味着你的grep命令应如下所示(注意引号):

egrep '^[0-9]{0,}X(\^[0-9]{1,}){0,1}$'  filename

你必须在C ++代码中传递的字符串是:

"^[0-9]{0,}X(\\^[0-9]{1,}){0,1}$"

如果您使用更传统的缩写替换所有显式量词,则会得到@ ildjarn的答案:{0,}*{1,}+{0,1}?