C++ 正则表达式,未找到匹配项

C++ 正则表达式,未找到匹配项,c++,regex,fstream,C++,Regex,Fstream,我有一段代码,它通过一个文件查找日期,但没有返回找到与正则表达式匹配的结果 代码: 是我的正则表达式不正确还是其他原因?原因在于正则表达式以及如何指定字符串文字: 在对正则表达式进行任何修复之前,请尝试将字符串文本打印到控制台: 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}))$"; 通过[0,1],您可能需要[01]。当您

我有一段代码,它通过一个文件查找日期,但没有返回找到与正则表达式匹配的结果

代码:


是我的正则表达式不正确还是其他原因?

原因在于正则表达式以及如何指定字符串文字:

  • 在对正则表达式进行任何修复之前,请尝试将字符串文本打印到控制台:

    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}))$";
    
  • 通过
    [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年,但这可能是您的业务逻辑。

原因在于您的正则表达式以及如何指定字符串文字:

  • 在对正则表达式进行任何修复之前,请尝试将字符串文本打印到控制台:

    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}))$";
    
  • 通过
    [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年,但这可能是您的业务逻辑。

原因在于您的正则表达式以及如何指定字符串文字:

  • 在对正则表达式进行任何修复之前,请尝试将字符串文本打印到控制台:

    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}))$";
    
  • 通过
    [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年,但这可能是您的业务逻辑。

原因在于您的正则表达式以及如何指定字符串文字:

  • 在对正则表达式进行任何修复之前,请尝试将字符串文本打印到控制台:

    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}))$";
    
  • 通过
    [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年,但这可能是你的业务逻辑。

这并没有解决问题,只是简化了你的正则表达式:
^[0,1]?\d\/([0-2]?\d)|(3[0,1])\/([199\d)|([2-9]\d{3}))$
这并没有解决问题,只是简化了你的正则表达式:
^[0,1]?\d\/([0-2]。[1993])|([2-9]\d{3})$
这并没有解决问题,只是简化了你的正则表达式:
^[0,1]?\d\/([0-2]?\d)\/(3[0,1])/((199\d)|([2-9]\d{3}))$
这并没有解决问题,只是简化了你的正则表达式:
^[0,1]?\d\/([0-2]?)/(3[0,2]?)/(199 d){$
非常感谢您的详细解释。我不知道如何编写正则表达式,这是我第一次使用正则表达式,实际上我对它们一无所知。我只是从谷歌复制了这个表达式。您知道我可以从哪些资源中了解它们。另外,我不想将它限制在1990年到9999年,我该怎么做DaveCribbs:你想在哪个年度使用?在资源方面,在C++的情况下,检查ECMA/JavaScript ReExp(因为C++中的正则表达式是基于它的)。首先,然后检查您是否需要更深入的解释。有没有办法让它接受任何年份,或者它必须有一个规范?@DaveCribbs:取决于您的应用程序。如果您不真正关心年份的位数,您可以让它成为
\d+
。非常感谢您的详细解释。我不知道如何编写r正则表达式,这是我第一次使用它,实际上我对它一无所知。我只是从谷歌复制了这个表达式。你知道我可以从哪些资源中了解它们。另外,我不想把它限制在1990年到9999年,我该如何解决这个问题?再次感谢。@DaveCribbs:今年你想要什么范围?至于re源代码,在C++的情况下,检查ECMA/JavaScript ReGEXP(因为C++中的正则表达式是基于它)首先,然后检查您是否需要更深入的解释。有没有办法让它接受任何年份,或者它必须有一个规范?@DaveCribbs:取决于您的应用程序。如果您不真正关心年份的位数,您可以让它成为
\d+
。非常感谢您的支持