PostgreSQL正则:如何用后向断言匹配无前缀的年月格式?
正则匹配无前缀日的年月格式(PostgreSQL环境)
需求说明
匹配「September 2020」或「September 20」这类无前缀日的月份+年份组合,同时排除以下带日前缀的格式:
- 带点的日前缀:
21. September 2020 - 不带点的日前缀:
21 September 20
原有正则的问题
之前尝试的正则:
(?<![0-9][.]) September [1-4]?[0-9]?[0-9][0-9]
仅能排除带点的日前缀场景,无法覆盖不带点的情况;且PostgreSQL不支持可变长度后向断言,不能直接将后向断言中的点设为可选。
解决方案
利用PostgreSQL支持的固定长度否定后向断言,通过两个断言组合覆盖两种前缀场景:
(?<![0-9])(?<![0-9][.]) September (?:[0-9]{4}|[0-9]{2})
正则解释
(?<![0-9]):确保月份前不是单个数字,排除不带点的日前缀(如21 September 20中的1 September部分)(?<![0-9][.]):确保月份前不是「数字+点」的格式,排除带点的日前缀(如21. September 2020)(?:[0-9]{4}|[0-9]{2}):匹配4位年份(如2020)或2位年份(如20),使用非捕获组优化性能
可选优化:单词边界
如果需要避免月份被误匹配为更长单词的一部分(比如Septemberxyz),可以添加单词边界\b:
(?<![0-9])(?<![0-9][.])\bSeptember\b (?:[0-9]{4}|[0-9]{2})
内容的提问来源于stack exchange,提问作者Silvan
相关产品推荐
相关产品推荐

