Redshift 的前向和后向 REGEX 替代方案 [已关闭]

问题描述 投票:0回答:1

上下文: 我正在 EMR 集群上使用 Spark 来查询 Redshift 数据库; Redshift 正则表达式语法的文档位于 https://docs.aws.amazon.com/redshift/latest/dg/pattern-matching-conditions-posix.html

我正在尝试在 SQL 中编写正则表达式语句来搜索遵循以下格式的任何日期:1/2 位数字(+可选后缀)月份名称,2 或 4 位数字年份,例如 24 年 1 月 24 日。

日期和年份是可选部分,因此仅“一月”也应该经过。我尝试添加正向向后查找和向前查找,以排除任何可能不是日期或年份的数字,即在“1 月 24 日 20%”中,只有“1 月 24 日”应该经过。同样,在“£15 January 24”中,只应包含“January 24”。下面是更多示例,其中粗体文本指示正则表达式应找到的内容:

3月23日11日

5 3 月 23 日

节省 £5 3 月 23 日

3 月 12 日 25% 折扣

正则表达式也不应替换单词中出现月份缩写的实例,即“Marketing”一词中的“Mar”,不应被识别为月份。

我的问题是,我不认为我的环境支持任何类型的前瞻或后瞻,因为它们似乎不起作用,所以任何人都可以建议替代方案来实现确切的预期结果吗?

下面是当前的正则表达式语句,可以在开始和结束处看到前向和后向:

(?<=^|\s)(\d{1,2}(st|nd|rd|th)?\s?)?([Mm]ar(ch)?|MAR(CH)?)(\s?\d{2}(\d{2})?)?(?=\s|$)
regex amazon-redshift regex-lookarounds
1个回答
0
投票

这将处理您的上述用例。要求匹配空格或字符串的开头/结尾允许它以

\b
不会的方式完成与环视相同的事情:

(?:(?: |^)\d{1,2}(:st|nd|rd|th)? )?(?:[Mm]ar(ch)?|MAR(CH)?)(?: \d{2,4}(?: |$))?

细分为这分为 3 个部分:

  • 可选领先日期
    (?:(?: |^)\d{1,2}(?:st|nd|rd|th)? )?
    • 所需的空格或字符串开头
      (?: |^)
    • 一位或两位数字
      \d{1,2}
    • 可选后缀
      (?:st|nd|rd|th)?
    • 所需空间
       
  • 所需月份
    (?:[Mm]ar(ch)?|MAR(CH)?)
  • 可选尾随年份
    (?: \d{2,4}(?: |$))?
    • 所需空间
       
    • 两到四位数
      \d{2,4}
    • 所需的空格或字符串结尾
      (?: |$)
© www.soinside.com 2019 - 2024. All rights reserved.