【问题标题】:Issue with REGEXP_SUBSTRREGEXP_SUBSTR 问题
【发布时间】:2018-10-13 01:21:58
【问题描述】:

我在 /AB/25MAR92/ 和 /AB/25MAR1992/ 之类的列中有文本。我试图从列中仅提取 25MAR92 和 25MAR1992 以进行我必须进行的日期计算。你能帮忙解决这个问题的 REGEXP_SUBSTR 函数吗? 谢谢!

【问题讨论】:

  • 日期的数据格式格式(2 或 02)无关紧要,因为我只需要年份。在某些情况下需要 2 位数(Mar99),在某些情况下需要 4 位数(Mar1999 )

标签: regex teradata regexp-substr


【解决方案1】:

你可以试试:

\b\d{1,2}[A-Z]{3}\d{2,4}\b

但这也将匹配02MAR992。要排除这种可能性,请使用:

\b\d{1,2}[A-Z]{3}(?:\d{2}|\d{4})\b

这将匹配02MAR1992 和02MAR92,但不会匹配02MAR992。

【讨论】:

    【解决方案2】:

    我建议使用这样的模式:

    \/(\d{2}[A-Z]{3}(19|20)?\d{2})\/
    
    • 年份限于 1900-2099。

    Demo

    • 如果您不想在\d{2} 当天允许任何两位数的值,
      您可以添加此模式而不是匹配 01-31 的 (0[1-9]|[12][0-9]|3[01]);

      \/((0[1-9]|[12][0-9]|3[01])[A-Z]{3}(19|20)?\d{2})\/

    • 或者,如果您允许像 /AB/2MAR92/ 这样的日期没有前导零的日期
      改为添加(0[1-9]|[12][0-9]|3[01]|[1-9]):

      \/((0[1-9]|[12][0-9]|3[01]|[1-9])[A-Z]{3}(19|20)?\d{2})\/

    我使用/ 作为锚点。如果不喜欢,可以使用\b。


    针对您最新的 cmets,我推荐的模式如下所示:

    \b\d{1,2}[A-Z]{3}(?:19|20)?\d{2}\b
    

    【讨论】:

    • 不客气。欢迎随时accept。
    猜你喜欢
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2022-07-01
    • 2016-05-22
    • 2018-03-11
    • 2013-08-27
    • 2014-05-28
    • 1970-01-01
    相关资源
    最近更新 更多