REGEXP_SUBSTR Redshift

时间:2018-02-16 23:45:44

标签: amazon-redshift

我正在尝试从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]

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

你走了。 我找到了正确的正则表达式使用 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);

创建该功能后,您可以在任何红移选项中使用它。

所以,在你的情况下:

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

答案 1 :(得分:0)

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

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

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

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

我建议尽可能使用内置函数而不是UDF。 UDF在您需要它们时非常棒,但它们确实会导致性能下降。