我有代码通过文件查找日期,但没有返回它找到了与我的正则表达式匹配的信息。
代码:
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:
是我的正则表达式不正确还是其他原因?
最佳答案
原因在于您的正则表达式以及您如何指定字符串文字:
在我们对您的正则表达式进行任何修复之前,尝试将字符串文字打印到控制台:
std::cout << "^[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}))$";
你会看到
\
丢失,并且<regex>
看不到他们。指定
\
在一个字符串中,你需要转义它,\\
.顺便说一下,打印字符串是在没有专用 RegExp 文字的语言中的调试步骤之一,必须通过字符串来完成构造。
您正在使用
^
锚定您的搜索和$
.只有当日期单独出现在一行中时,它才会找到匹配项,而且前导或尾随空格都不能有。您有很多冗余语法,例如
[1]{1}
或者 。可以取出具有单个字符(不是正则表达式中的特殊字符)的字符类,即1{1}
.和{1}
总是是多余的,即[1]{1}
可以缩短为1
./
不需要在字符串文字或正则表达式中转义。修正上面的句法问题并删除
^
和$
:"[0,1]?\\d/(([0-2]?\\d)|(3[0,1]))/((199\\d)|([2-9]\\d{3}))"
通过
[0,1]
,你可能想要[01]
.当您想匹配任一字符时A
或B
, 只需将它们放在字符类中并排放置[AB]
.你的[0,1]
还将匹配逗号,
.您可以删除
()
在([0-2]?\\d)
,(3[0,1])
.年度部分相同。外层捕获组就够了。应用以上两点:
"[01]?\\d/([0-2]?\\d|3[01])/(199\\d|[2-9]\\d{3})"
当您想要提取数据时,正则表达式现在应该可以工作,但如果您想要使用它来验证,则不太好。我不知道你为什么将年份限制为 1990 到 9999,但这可能是你的业务逻辑。
关于c++ - 正则表达式,找不到匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26416793/