选择中的 PostgreSQL 正则表达式捕获组

新手上路,请多包涵

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

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

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

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

如果您试图捕获由表达式产生的正则表达式匹配,那么 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]

原文由 Hambone 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 regexp_matches

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

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

原文由 Vamsi Prabhala 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进