Postgres:将文本提取到字符串中的第N个字符

时间:2017-12-26 17:35:40

标签: regex postgresql

如何将文本提取到列中第4个字符实例?

我从名为filter_type的列中选择文本,直到第四个>字符。

要做到这一点,我一直试图找到第四个>字符的位置,但它不起作用:

select substring(filter_type from 1 for position('>' in filter_type))

3 个答案:

答案 0 :(得分:1)

您可以在Postgres中使用pattern matching功能。

首先找出一个模式来捕获第四个>字符的所有内容。

要启动您的模式,您应该创建一个子组,用于捕获非>个字符和一个>字符:

([^>]*>)

然后捕获四次以进入>的第四个实例

([^>]*>){4}

然后,您需要将其包装在一个组中,以便匹配带回所有四个实例:

(([^>]*>){4})

并设置一个字符串符号的开头,以确保它只匹配字符串的开头(不在中间):

^(([^>]*>){4})

Here's a working regex101 example of that!

一旦你拥有了将在第一个组元素中返回你想要的模式(你可以在右侧面板的在线正则表达中告诉你),你需要在SQL中选择它。

在Postgres中,substring function可以选择使用正则表达式模式,使用子字符串中的“from”语句从输入中提取文本。

要完成,请将它们放在一起!

select substring(filter_type from '^(([^>]*>){4})')
from filter_table

See a working sqlfiddle here

如果要在>的实例少于四个时匹配整个字符串,请使用此正则表达式:

 ^(([^>]*>){4}|.*)

答案 1 :(得分:0)

substring(filter_type from '^(([^>]*>){4})')

这种子字符串形式允许您提取与正则表达式模式匹配的字符串部分。

答案 2 :(得分:0)

您还可以使用简单的非正则表达式解决方案:

SELECT array_to_string((string_to_array(filter_type, '>'))[1:4], '>')

以上查询:

  1. 使用“>”作为分隔符将字符串拆分为数组
  2. 仅选择前4个元素
  3. 将数组转换回字符串