正则表达式捕获字符之前的第一个单词 - Postgresql

3

参考这个问题,但现在在PostgreSQL里,我如何捕获等号前面的单词?URL中还有另一个等号,我不想捕获它。

SELECT
  TRIM(',' FROM REGEXP_REPLACE('TType=SEND|Status=OK|URL=min://j?_a=3&ver=1.1|day=3',
                '=[^|]+($|\|)', ',')) "PARAMS"    

从上述字符串 TType=SEND|Status=OK|URL=min://j?_a=3&ver=1.1|day=3 中,我只想要 TType、Status、URL、day

注:该字符串使用管道分隔符 | 分割参数。

2个回答

1

逐步演示:db<>fiddle

SELECT
    string_agg(                                          -- 3
        split_part(elements, '=', 1),                    -- 2        
        ','
    )
FROM mytable,
    regexp_split_to_table(mystring, '\|') as elements    -- 1
  1. 将字符串按照 A=B 的格式分割成参数。将每个参数放入单独的记录中。
  2. = 字符处拆分这些元素,并返回第一个拆分结果。
  3. 最后将所有的第一个拆分结果聚合到一个字符串列表中。

1

您可以使用

SELECT ARRAY_TO_STRING (
 ARRAY (
   SELECT REGEXP_MATCHES (
      'TType=SEND|Status=OK|URL=min://j?_a=3&ver=1.1|day=3',
      '(?:\||^)(\w+)=', 'g'
   )
 ), ',') as PARAMS

请查看正则表达式演示

注意: 如果在正则表达式模式中定义了捕获组,则REGEXP_MATCHES仅返回捕获组值。这里,该模式表示:

  • (?:\||^) - (一个非捕获组,匹配)|或字符串的开头
  • (\w+) - 捕获组1(实际返回值):任意一个或多个字母数字字符
  • = - 一个=字符。

REGEXP_MATCHES的结果首先转换为数组,然后使用ARRAY_TO_STRING转换为字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接