首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式,找不到匹配

正则表达式,找不到匹配
EN

Stack Overflow用户
提问于 2014-10-17 02:04:34
回答 1查看 256关注 0票数 0

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

代码:

代码语言:javascript
复制
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();
}

产出:

代码语言:javascript
复制
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:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-17 02:32:27

原因在于正则表达式和指定字符串文本的方式:

  • 在对regex进行任何修复之前,请尝试将字符串文字打印到控制台: 性病::cout << << 您将看到\丢失了,而<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]。当您想匹配字符AB时,只需将它们放置在字符类[AB]中。您的[0,1]还将匹配逗号,
  • 您可以把()放在([0-2]?\\d)(3[0,1])中。年份部分也是如此。外部捕捉组就足够了。
  • 适用上述两点: “01\d/(0-2\d\\d\301)/(199\d_2-9\d{3})”

当您想要提取数据时,regex现在应该可以工作,但是如果您想要使用它来验证数据,那就不太好了。我不知道你为什么把年份限制在1990年至9999,但这可能是你的业务逻辑。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26416793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档