【问题标题】:Conditional matching not working with perl条件匹配不适用于 perl
【发布时间】:2015-01-07 20:47:10
【问题描述】:

我必须编写一个正则表达式来匹配下面的字符串并提取年份

版权所有 2015 或版权所有 2014-2015

我已经编写了下面给出的正则表达式并尝试在 perl 程序中执行代码

Copyright\s+(?(?=\d+\s*-\s*\d+)(\d+)\s*-\s*(\d+)|(\d+))

上面给出的正则表达式匹配字符串 Copyright 2014-2015,但当字符串为 Copyright 2015 时失败。我做错了什么?

【问题讨论】:

  • 为我工作。你如何测试它?为什么不简单地/Copyright\s+(\d+)(?:\s*-\s*(\d+))?/
  • @Сухой27:你为什么要把它编辑成 PCRE? Perl 和 PCRE 是不同的。
  • @nhahtdh 没有 perl 代码,它看起来只与正则表达式有关。
  • @Сухой27 如果 OP 将其标记为 Perl,我会说这足以假设它是 Perl。
  • 我将正则表达式保存在一个变量中,并尝试如下检索它,但我没有得到匹配的字符串。 ($firstmatch, $secondMatch) = $string =~ m/$COPYRIGHT_PATTERN/g;

标签: regex perl


【解决方案1】:

您的正则表达式正在运行:

Copyright\s+(?(?=\d+\s*-\s*\d+)(\d+)\s*-\s*(\d+)|(\d+))

匹配项:2015 年捕获组 3 中的版权所有
匹配项:版权所有 2014-2015 捕获组 1 和 2


Copyright\s+(\d+)(?:\s*-\s*(\d+))?

匹配项:版权所有 2015 捕获组 1
匹配项:版权所有 2014-2015 捕获组 1 和 2

【讨论】:

  • 谢谢,我没有捕获所有组。 尴尬
  • @Andie2302 您可能想在其中添加一些\s+\s* 来模仿OP 的正则表达式。 ([0-9] vs \d 是另一个讨论。)
猜你喜欢
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多