代码之家  ›  专栏  ›  技术社区  ›  IEnumerator

修改regex以使日期与序号“st”、“nd”、“rd”、“th”匹配

  •  1
  • IEnumerator  · 技术社区  · 16 年前

    如何修改下面的regex,使其与日期部分的序号相匹配?此regex匹配“2003年1月1日2004年2月29日2004年11月02日,3202”,但我也需要它匹配:“2003年1月1日2004年2月29日2004年11月02日,3202 2010年3月3日”

    ^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))))\,\ ((1[6-9]|[2-9]\d)\d{2}))
    

    谢谢您。

    2 回复  |  直到 16 年前
        1
  •  5
  •   Jay    16 年前

    这将取决于您的用例,但是为了实用主义的利益,您可能会做得很好,只匹配任何匹配的东西:
    (一)月份名称或者简称;
    (2)空白区;
    (三)一、二位数;
    (4)空白区;
    (5)任何ST、ND、RD、TH;
    (6)空格或逗号+可选空格;
    (七)任何四位数;

    我不知道你在匹配什么,但如果我有 Jan 35nd,3001 我想我宁愿 立即捕获并稍后使其失效 而不是在一开始就跳过它。

    此外,根据您的数据集,考虑区分大小写问题和常见的国际英语变体,如 1 Jan 2004 1st Jan, 2004 January, 2004 等。

    添加换行符

    ^(?:j(?:an(?:uary)?|un(?:e)?|ul(?:y)?)?|feb(?:ruary)?|ma(?:r(?:ch)?|y)
    |a(?:pr(?:il)?|ug(?:ust)?)|sep(?:t|tember)?|oct(?:ober)?|(?:nov|dec)(?:ember)?)  
    \s+\d{1,2}(?:st|nd|rd|th)?(?:\s+|,\s*)\d{4}\b
    

    更加务实(和 可读的 ,除非您有一个非常奇怪的数据集,否则允许在公共前缀之后使用任何内容:

    (?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*?\s+\d{1,2}(?:[a-z]{2})?(?:\s+|,\s*)\d{4}\b
    

    这个匹配吗 octagenarianism 99xx, 0000 ?对。这可能是个问题吗?我对此表示怀疑。

        2
  •  2
  •   Max Shawabkeh    16 年前

    那个雷鬼做的太多了。你最好用你的语言 strptime() . 但是,下面的regex将匹配序号:

    ^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31(st)?)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))(st|nd|rd|th)?|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(th)?(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))(st|nd|rd|th)?))\,\ ((1[6-9]|[2-9]\d)\d{2}))
    

    请注意,它也会匹配“20”之类的东西,但是在实际数据中遇到这种情况的可能性太低,在大多数情况下都不需要关心。

    推荐文章