C++ 正则表达式验证失败,而egrep验证正常
我试图使用正则表达式来验证字符串,因此在进一步说明之前,首先让我解释一下字符串的外观:可选位数后跟“X”和可选(“^”后跟一个或多个数字) 下面是一些Exmaple:“2X”、“X”、“23X^6”符合模式,而“X^”、“4”、“foobar”、“4X^”、“4X44”等字符串则不符合模式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++时,它失败了。 下面是我用来验证
现在我在哪里:使用“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}$"