如何通过 Redshift psql 提取正则表达式组

How to extract regex group through Redshift psql

我在 python 和 Redshift psql 上尝试过的相同正则表达式模式在 python 上有效,但在 Redshift psql 上无效。

我的字符串如下所示: s = 'AB.w127 xyz (9f6h, 89) amf, like mr .345x980 abcd' 我想把"AB"和".345x980"之间的都提取出来(这里是"w127 xyz (9f6h, 89) amf, like mr "),这里的相乘数会不一样,中间的内容是完全不可预测。 所以在我的 Redshift psql 查询中,我使用了 regexp_substr(s, 'AB\.(.*?)\.\d+x\d+.*?')。我希望至少能得到一些东西,以便以后我可以使用 group(1) 作为 python 逻辑。

但是 Redshift 一直显示这个错误:

Invalid preceding regular expression prior to repetition operator. The error occured while parsing the regular expression: 'AB.(.?>>>HERE>>>).d+xd+.?'.

我也尝试了模式 AB\.(.*?)\.\d+x\d+.*?'),但仍然出现同样的错误。

有没有办法用 Redshift psql 提取字符串?

遗憾的是,Amazon Redshift 仅 POSIX regex 不支持惰性量词。

也就是说,看起来你不需要它们,AB\.(.*)\.\d+x\d+应该可以。


关于如何提取中间文本的问题,我们对 Redshift 的正则表达式功能几乎没有选择。 全部 大多数好东西都不受支持。最好先提取然后使用 CHARINDEXSUBSTRING 来隔离内部部分。

然而,最后一个技巧是使用

regexp_replace( text, '.*AB\.|\.\d+x\d+.*') 

如链接文档中所述,POSIX 样式的 \d 字符 classes 必须使用两个反斜杠 (\) 或使用等效字符 class 表达式,例如[[:digit:]]

非常感谢您的回答!最后用 regexp_replace(s, 'AB\.|\.\d+x\d+.*') 解决了问题,这里我不得不使用 \d,否则 Redshift 给了我空结果