C++ 正则表达式验证失败,而egrep验证正常

C++ 正则表达式验证失败,而egrep验证正常,c++,regex,c++11,grep,C++,Regex,C++11,Grep,我试图使用正则表达式来验证字符串,因此在进一步说明之前,首先让我解释一下字符串的外观:可选位数后跟“X”和可选(“^”后跟一个或多个数字) 下面是一些Exmaple:“2X”、“X”、“23X^6”符合模式,而“X^”、“4”、“foobar”、“4X^”、“4X44”等字符串则不符合模式 现在我在哪里:使用“EGRIP”和“^ [09] { 0,}\x(\[09] { 1,})$”ReGEX I可以验证这些字符串是否好,但是当用C++ 11正则表达式库尝试C++时,它失败了。 下面是我用来验证

我试图使用正则表达式来验证字符串,因此在进一步说明之前,首先让我解释一下字符串的外观:可选位数后跟“X”和可选(“^”后跟一个或多个数字)

下面是一些Exmaple:“2X”、“X”、“23X^6”符合模式,而“X^”、“4”、“foobar”、“4X^”、“4X44”等字符串则不符合模式

现在我在哪里:使用“EGRIP”和“^ [09] { 0,}\x(\[09] { 1,})$”ReGEX I可以验证这些字符串是否好,但是当用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;
}
#包括
#包括
#包括
#包括
int main()
{
std::regex r(“^[0-9]{0,}\\X(\\^[0-9]{1,})$”,
std::regex_常量::egrep);
标准::向量challanges_ok{“2X”、“X”、“23X^66”、“23X^6”,
“3123X”、“2313131X^213123123”};
向量challanges_bad{“X^”,“4”,“asdsad”,“X”,
“4X44”、“4X^”};

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

还要注意的是,GCC对
的支持只是部分的,因此
std::regex
可能对您根本不起作用(“部分”在本文中显然意味着“损坏”);您是否尝试过或作为一种健全检查

可选位数,后跟“X”和可选(“^”后跟一个或多个数字)

好的,代码中的正则表达式与该描述不匹配,原因有两个:X上有一个额外的反斜杠,“^digits”部分不是可选的。您需要的正则表达式是:

^[0-9]{0,}X(\^[0-9]{1,}){0,1}$
这意味着您的grep命令应该如下所示(注意单引号):

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

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

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

为什么要在X前面加反斜杠?从shell中可能会消失,这样grep命令只会得到一个X,但代码中可能会混淆一些东西。您是否有可能使用gcc?上次我尝试时,regex库没有实现,匹配失败。请尝试使用boost.Ah.I我不知道部分支持。我会尝试一下。谢谢!在这种情况下是“部分”方法不起作用。在有人提供一个工作实现之前,不要浪费时间在GCC中尝试使用
std::regex
。从GCC 4.7开始,它适用于非常简单的REs,如
abc
,但不适用于带有锚定的任何东西,如
^abc$
"^[0-9]{0,}X(\\^[0-9]{1,}){0,1}$"