我有通过文件查找日期的代码,但是它没有返回,它找到了与我的正则表达式匹配的内容。
代码:
std::string s(line);
std::smatch m;
std::regex e("^[0,1]?\d{1}\/(([0-2]?\d{1})|([3][0,1]{1}))\/(([1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))$");
std::cout << "Target sequence: " << s << std::endl;
std::cout << "Regular expression: ^[0,1]?\d{1}\/(([0-2]?\d{1})|([3][0,1]{1}))\/(([1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))$" << std::endl;
std::cout << "The following matches and submatches were found:" << std::endl;
while (std::regex_search(s, m, e)) {
for (auto x : m) std::cout << x << " ";
std::cout << std::endl;
s = m.suffix().str();
}产出:
Success
Target sequence: 12/28/2002 2 15 38 43 50
Regular expression: ^[0,1]?d{1}/(([0-2]?d{1})|([3][0,1]{1}))/(([1]{1}[9]{1}[9]{1
}d{1})|([2-9]{1}d{3}))$
The following matches and submatches were found:
Enter q to quit:我的正则表达式是不正确还是其他原因?
发布于 2014-10-17 02:32:27
原因在于正则表达式和指定字符串文本的方式:
\丢失了,而<regex>看不到它们。
要在字符串中指定\,需要转义它,\\。
顺便说一句,在没有专用RegExp文字的语言中,打印字符串是调试步骤之一,并且必须通过string进行构造。^和$锚定搜索。只有当日期在一行中是独立的时候,它才会找到匹配的,而且甚至不能有前导或尾随空格。[1]{1}或。可以提取单个字符(在正则表达式中不是特殊字符)的字符类,即1{1}。而{1}是总是冗余的,即[1]{1}可以缩短为1。/不需要转义,无论是在字符串文本中还是在正则表达式中。^和$:
“0,1\d/((0-2\d)x(30,1)/((199)\d=(2-9\d{3}))”[0,1],您可能想要[01]。当您想匹配字符A或B时,只需将它们放置在字符类[AB]中。您的[0,1]还将匹配逗号,。()放在([0-2]?\\d),(3[0,1])中。年份部分也是如此。外部捕捉组就足够了。当您想要提取数据时,regex现在应该可以工作,但是如果您想要使用它来验证数据,那就不太好了。我不知道你为什么把年份限制在1990年至9999,但这可能是你的业务逻辑。
https://stackoverflow.com/questions/26416793
复制相似问题