上下文: 我正在 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|$)
这将处理您的上述用例。要求匹配空格或字符串的开头/结尾允许它以
\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}
(?: |$)