Redshift中用REGEX_SUBSTR提取" at"前内容的正则问题
Redshift中提取" at"前内容的正则问题解决
问题根源
你用的(?=\sat)是Perl兼容正则(PCRE)的正向前瞻断言,但Redshift采用的是POSIX扩展正则表达式(ERE),不支持这种零宽断言语法,所以会报正则解析错误。
三种可行解决方案
方案1:用REGEXP_SUBSTR捕获组提取
利用Redshift的REGEXP_SUBSTR支持捕获组的特性,指定提取第一个捕获组的内容:
SELECT regexp_substr('withdrawal from Credit Union at main avenue', '(.*?)\\sat', 1, 1, 'e', 1);
(.*?):非贪婪匹配任意字符(避免匹配到最后一个" at")\\sat:匹配空格+at(Redshift里转义空格需用双反斜杠)- 最后一个参数
1:指定提取第一个捕获组的内容
方案2:用REGEXP_REPLACE替换后部分
把" at"及后面的所有内容替换为空字符串:
SELECT regexp_replace('withdrawal from Credit Union at main avenue', '\\sat.*$', '');
\\sat.*$:匹配空格+at,以及从该位置到字符串结尾的所有内容- 替换为空后直接得到目标内容
方案3:用SPLIT_PART分割(最简单)
如果" at"是固定分隔符,直接用分割函数更高效:
SELECT split_part('withdrawal from Credit Union at main avenue', ' at', 1);
- 按" at"分割字符串,取第一部分即可
以上三种方法都能返回你期望的结果:withdrawal from Credit Union
内容的提问来源于stack exchange,提问作者13R1_
相关产品推荐
相关产品推荐

