REGEXP_SUBSTR 红移

Posted

技术标签:

【中文标题】REGEXP_SUBSTR 红移【英文标题】:REGEXP_SUBSTR Redshift 【发布时间】:2018-02-16 23:45:43 【问题描述】:

我正在尝试从 postgresql 中的文本字符串中提取子字符串。文本字符串的列名是 short_description,我正在使用 REGEXP_SUBSTR 函数来定义一个正则表达式,它将只返回我想要的部分:

SELECT  short_description, 
REGEXP_SUBSTR(short_description,'\\[[^=[]*') AS space
FROM my_table

这将返回以下内容:

short_description                                        space
----------------------------------------------------------------------------
[ABC12][1][ABCDEFG] ACB DEF [HIJ]           |            [ABC12]

我想拉的是以下内容:

short_description                                        space
----------------------------------------------------------------------------
[ABC12][1][ABCDEFG] ACB DEF [HIJ]           |            [ABCDEFG]

有什么想法吗?

【问题讨论】:

【参考方案1】:

您可以使用Regex character classes 来帮助进行这种匹配。在这里,我只寻找字母,用括号括起来,然后是一个空格。注意使用双反斜杠 \\ 来转义文字括号和字符类的双括号 [[:a:]]

SELECT REGEXP_SUBSTR('[ABC12][1][ABCDEFG] ACB DEF [HIJ]','\\[[[:alpha:]]+\\] ');
 regexp_substr
---------------
 [ABCDEFG]

您还可以使用 SPLIT_PART 函数通过在右括号 ] 上拆分并选择第三个值来实现类似的效果。

SELECT SPLIT_PART('[ABC12][1][ABCDEFG] ACB DEF [HIJ]',']',3);
 split_part
------------
 [ABCDEFG

如果可能的话,我建议使用内置函数而不是 UDF。 UDF 在您需要时非常棒,但它们确实会导致性能损失。

【讨论】:

不确定性能但绝对使用这个而不是我的 UDF 版本! - 好答案!【参考方案2】:

给你。 我找到了正确的正则表达式 https://txt2re.com

然后,我将它实现为 python redshift UDF

create or replace function f_regex (input_str varchar(max),regex_expression varchar(max))
  returns VARCHAR(max)
stable
as $$
import re
rg = re.compile(regex_expression,re.IGNORECASE|re.DOTALL)
return rg.search(input_str).group(1)
$$ language plpythonu;

select f_regex('[ABC12][1][ABCDEFG] ACB DEF [HIJ] '::text,'.*?\\[.*?\\].*?\\[.*?\\](\\[.*?\\])'::text);

创建函数后,您可以在任何 redshift 选择中使用它。

所以,在你的情况下:

SELECT  short_description, 
f_regex(short_description::text,'.*?\\[.*?\\].*?\\[.*?\\](\\[.*?\\])'::text) AS space
FROM my_table

【讨论】:

以上是关于REGEXP_SUBSTR 红移的主要内容,如果未能解决你的问题,请参考以下文章

亚马逊 Redshift 的 REGEXP_SUBSTR 中的“匹配但排除”

如何选择特定范围(使用红移正则表达式)

regexp_replace 和 regexp_substr 变量的比较

Oracle中REGEXP_SUBSTR函数

在 postgresql 中按级别和 regexp_substr 连接

oracleoracle REGEXP_SUBSTR分割字符串