我正在尝试使用正则表达式来验证字符串,所以在我再进一步之前让我首先解释一下字符串是什么样的:可选的数字后跟一个'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进行编译。
答案 0 :(得分:4)
您的正则表达式无法使'^'
后跟一个或多个数字可选;将其改为:
"^[0-9]*X(\\^[0-9]+)?$"
。
另请注意,this page表示GCC对<regex>
的支持只是部分支持,因此std::regex
可能根本不起作用(在这种情况下,“部分”显然意味着'已损坏' );您是否尝试过Boost.Xpressive或Boost.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}
是?
。