gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:23:15 28 4
gpt4 key购买 nike

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

代码:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com