选择PostgreSQL正则表达式捕获组

时间:2017-01-24 00:53:13

标签: sql regex postgresql

如何从SQL select中返回匹配的正则表达式?我尝试使用REGEXP_EXTRACT没有运气(功能不可用)。我所做的确实有效是这样的:

SELECT column ~ '^stuff.*$'
FROM table;

但这给了我一个真/假的清单。我想知道在每种情况下提取的是什么。

3 个答案:

答案 0 :(得分:15)

如果您尝试捕获表达式产生的正则表达式匹配,那么substring就可以解决问题:

select substring ('I have a dog', 'd[aeiou]g')

会返回任何匹配项,在本例中为“dog。”

我认为您上面尝试的缺失链接是您需要将要捕获的表达式放在括号中。 regexp_matches在这种情况下会起作用(如果你想要捕获的表达式中包含括号),但会返回每个匹配的文本数组。如果是一场比赛,substring就很方便了。

因此,如果您尝试返回stuff当且仅当它位于列的开头时,请回到您的示例:

select substring (column, '^(stuff)')

select (regexp_matches (column, '^(stuff)'))[1]

答案 1 :(得分:5)

使用regexp_matches

SELECT regexp_matches(column,'^stuff.*$')
FROM table
  

regexp_matches函数返回由匹配POSIX正则表达式模式得到的所有捕获的子串的文本数组。它具有语法regexp_matches(string,pattern [,flags])。该函数不能返回任何行,一行或多行(请参阅下面的g标志)。如果模式不匹配,则该函数不返回任何行。如果模式不包含带括号的子表达式,则返回的每一行都是一个单元素文本数组,其中包含与整个模式匹配的子字符串。如果模式包含带括号的子表达式,则该函数返回一个文本数组,其第n个元素是与模式的第n个带括号的子表达式匹配的子字符串(不计算“非捕获”括号;有关详细信息,请参见下文)。 flags参数是一个可选的文本字符串,包含零个或多个单字母标志,用于更改函数的行为。标志g使函数找到字符串中的每个匹配项,而不仅仅是第一个匹配项,并为每个匹配项返回一行。

答案 2 :(得分:1)

我使用的是使用PostgreSQL 8.0.2的Amazon Redshift(我应该在问题中提到这一点)。对我来说,有效的是REGEXP_SUBSTR

e.g。

SELECT REGEXP_SUBSTR(column,'^stuff.*$')
FROM table