【问题标题】:Regex to match month name followed by year正则表达式匹配月份名称后跟年份
【发布时间】:2011-02-08 23:22:15
【问题描述】:

例如,是否可以使用正则表达式来匹配“February 2009”?

【问题讨论】:

  • 是否允许匹配“Undecimber 15000”?
  • 限制是 1 月 - 12 月,然后是 1990 年 - 2010 年。幸运的是,非英语不是问题。
  • 随后是 1990 - 2010 — 设置这个严格的上限是故意的吗?距离 2011 年仅剩 8 个月了。

标签: regex


【解决方案1】:

顺着

\b(?:Jan(?:uary)?|Feb(?:ruary)?|...|Dec(?:ember)?) (?:19[7-9]\d|2\d{3 })(?=\D|$)

那是

\b # 一个单词边界 (?: # 非捕获组 一月)? # 一月) |二月(?:ruary)? # |... # 以此类推 |十二月(?:ember)? # 十二月(余烬) ) # 结束组 # 空间 (?: # 非捕获组 19[7-9]\d|2\d{3} # 1970-2999 ) # 结束组 (?=\D|$) # 后跟:除数字或字符串结尾之外的任何内容

【讨论】:

  • OBTW, 1990-2010 是 (?:199\d|20[01]\d)
【解决方案2】:

我不得不为此努力以匹配一些边缘示例,但我最终使用了

(\b\d{1,2}\D{0,3})?\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?)\D?(\d{1,2}\D?)?\D?((19[7-9]\d|20\d{2})|\d{2})

捕捉带有单词月份的日期

【讨论】:

  • 只是一件小事,几个月而不是 (Nov|Dec) 应该是 (?:Nov|Dec),或者至少我必须更改它才能使其与 Python 一起使用否则它会返回一个空的 [''] 匹配
  • 您可以根据您使用的正则表达式处理器添加 (?i)(regex_part_to_make_case_insensitive) 或 (?i)regex_part_to_make_case_insensitive(?-i)。
【解决方案3】:

修改 Beerswiller 的答案,如果您想要“st”/“nd”/“rd”变体:

(\b\d{1,2}\D{0,3})?\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?)\D?(\d{1,2}(st|nd|rd|th)?)?(([,.\-\/])\D?)?((19[7-9]\d|20\d{2})|\d{2})*

【讨论】:

  • 它也将 1999 年 7 月 34 日作为有效日期!
【解决方案4】:

这个正则表达式解释了逗号周围的一些间距。

有时它并不总是在正确的位置。

((\b\d{1,2}\D{0,3})?\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?)\D?)(\d{1,2}(st|nd|rd|th)?)?((\s*[,.\-\/]\s*)\D?)?\s*((19[0-9]\d|20\d{2})|\d{2})*

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多