【问题标题】:RegEx for matching various dates用于匹配各种日期的正则表达式
【发布时间】:2019-10-15 14:22:48
【问题描述】:

我正在尝试组合一个正则表达式语句以匹配以下每种日期格式。

* Mar 7, 2017
Mar. 7, 2017
* March 7, 2017
3-7-2017
03-07-2017
3-7-17
03-07-17
* 03/7/2017
* 03/07/17
* 3/7/17
Mar-07-2017
Mar-7-2017
March-07-2017

下面的正则表达式匹配上面用星号表示的日期格式。我徒劳地尝试添加我已经拥有的东西,但没有成功。

([0-9]+)/([0-9]+)/([0-9]+)|([12]\d{3}-(0[1-9]|1[ 0-2])-(0[1-9]|[12]\d|3[01]))|\w+\s\d{2},\s\d{4}|(?i)\ b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?: y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec](?:ember)?)\b (?:0?[1-9]|[1-2][0-9]|3[01]),? \d{4}

我们总是感谢任何帮助!

* 额外问题 *

在某些情况下,可能有多个日期匹配,我需要它来查找某个单词后面的匹配项。过去,我通过在句点后的括号之间括起正则表达式语句来使用以下语法。

(?<=Word).(StatementHere)

【问题讨论】:

  • 2017 年 7 月 3 日(标准)日期格式怎么样?如果你不接受 D / M / Y,你就排除了世界上的大多数人。
  • 虽然这可能是真的,但我只需要它与我列出的格式相匹配。如果有一个声明可以涵盖您列出的格式,我也很乐意接受:)。我的需要不需要它。
  • 您使用的是 PCRE (php),还是 Perl 或 Ruby?
  • 不确定如何回答这个问题,因为我不一定会使用其中任何一个。我将内容复制到 Notepad++ 中,然后使用“查找”并将搜索模式设置为使用正则表达式。
  • Notepad++ 使用 PCRE,不过没关系。我只是想用一些函数优化正则表达式。

标签: regex regex-negation regex-lookarounds regex-group regex-greedy


【解决方案1】:

那就试试这个吧……

([0-9]+)/([0-9]+)/([0-9]+)|((0?[1-9]|1[0-2])-(0?[1-9]|[12]\d|3[01])-(\d{4}|\d{2}))|\w+\s\d{2},\s\d{4}|(?i)\b(Jan(?:uary|\.)?|Feb(?:ruary|\.)?|Mar(?:ch|\.)?|Apr(?:il|\.)?|May|Jun(?:e|\.)?|Jul(?:y|\.)?|Aug(?:ust|\.)?|Sep(?:tember|\.)?|Oct(?:ober|\.)?|Nov(?:ember|\.)?|Dec(?:ember|\.)?)([ ](?:0?[1-9]|[1-2][0-9]|3[01]),?[ ]|-(?:0?[1-9]|[1-2][0-9]|3[01])-)(\d{4})

https://regex101.com/r/k1vaVN/1

Readable version

    ( [0-9]+ )                    # (1)
    /
    ( [0-9]+ )                    # (2)
    /
    ( [0-9]+ )                    # (3)
 |  
    (                             # (4 start)
         ( 0? [1-9] | 1 [0-2] )        # (5)
         -
         ( 0? [1-9] | [12] \d | 3 [01] )  # (6)
         -
         ( \d{4} | \d{2} )             # (7)
    )                             # (4 end)
 |  
    \w+ \s \d{2} , \s \d{4} 
 |  
    (?i)
    \b 
    (                             # (8 start)
         Jan
         (?: uary | \. )?
      |  Feb
         (?: ruary | \. )?
      |  Mar
         (?: ch | \. )?
      |  Apr
         (?: il | \. )?
      |  May
      |  Jun
         (?: e | \. )?
      |  Jul
         (?: y | \. )?
      |  Aug
         (?: ust | \. )?
      |  Sep
         (?: tember | \. )?
      |  Oct
         (?: ober | \. )?
      |  Nov
         (?: ember | \. )?
      |  Dec
         (?: ember | \. )?
    )                             # (8 end)
    (                             # (9 start)
         [ ] 
         (?: 0? [1-9] | [1-2] [0-9] | 3 [01] )
         ,? [ ] 
      |  -
         (?: 0? [1-9] | [1-2] [0-9] | 3 [01] )
         -
    )                             # (9 end)
    ( \d{4} )                     # (10)

更新
只需将日期包装在 (?: ) 组中,然后在之前添加任何限定符
你需要的。

word[ ]or[ ]phrase[ ]+\K(?:([0-9]+)/([0-9]+)/([0-9]+)|((0?[1-9]|1[0-2])-(0?[1-9]|[12]\d|3[01])-(\d{4}|\d{2}))|\w+\s\d{2},\s\d{4}|(?i)\b(Jan(?:uary|\.)?|Feb(?:ruary|\.)?|Mar(?:ch|\.)?|Apr(?:il|\.)?|May|Jun(?:e|\.)?|Jul(?:y|\.)?|Aug(?:ust|\.)?|Sep(?:tember|\.)?|Oct(?:ober|\.)?|Nov(?:ember|\.)?|Dec(?:ember|\.)?)([ ](?:0?[1-9]|[1-2][0-9]|3[01]),?[ ]|-(?:0?[1-9]|[1-2][0-9]|3[01])-)(\d{4}))

【讨论】:

  • 这很好用!感谢您的详细回答 - 通过向我展示每个步骤。我还在我的原始帖子中添加了一个额外的注释。如果有多个日期匹配,我可以添加一些内容以使其直接匹配特定单词吗? (请参阅原始帖子的补充)您提供的声明本身就可以很好地工作,我一定会使用。但是当我试图将它嵌套在我自己现有的语句中时,它没有返回匹配项。再次感谢。你真是个天才!
  • 酷!好的,所以我尝试使用.... MyWord+(?:YourSyntax) .... 但这并不是我想要的。这与 PLUS 日期相匹配。我只希望比赛返回日期。很抱歉没有更好地澄清。另外,我认为12月部分可能有问题。如果后面跟着句点,它不想在 12 月匹配。
  • 好的,修复了 December 问题并添加了 \K 构造,与前面的单词不匹配,只是日期。如果您的系统不执行\K,请使用固定长度的lookbehind 断言,或者,在日期周围放置一个捕获组(),然后您可以只引用组1。
  • 两者现在都很好用!非常感谢。我尝试通过添加缺少的字符来修复 12 月的问题,但它没有用。你有魔力。
猜你喜欢
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2011-08-24
相关资源
最近更新 更多