c++ - 正则表达式,找不到匹配项

标签 c++ regex fstream

我有代码通过文件查找日期,但没有返回它找到了与我的正则表达式匹配的信息。

代码:

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] .当您想匹配任一字符时 AB , 只需将它们放在字符类中并排放置 [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/

相关文章:

c++ - 私钥解密代码使用公共(public)接口(interface)说明符到 BSAFE 库 v6.0?

c++ - 显式调用 `int` 析构函数 - 为什么需要类型别名?

javascript - 使用反斜杠转义字符串中的引号

正则表达式字符串匹配所有未包装的内容

c++ - 初学者 C++ - 打开一个文本文件进行阅读,如果它存在,如果不存在,则将其创建为空

c++ - 为什么我不能用 `ofstream` 的实例初始化对 `ifstream`/`fstream` 的引用?

c++ - 当 std::vector push_back() 具有引用成员的对象时

c++ - 从 Windows cmd 调用 MSYS bash

javascript - 一个字母和三个数字的正则表达式

c++ - 我只能从一个文件访问静态 fstream