在第 N 次出现后提取文本

问题描述 投票:0回答:4

我有几个这样的字符串:

1:723:NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor

我需要返回第二个冒号(

:
)之后的所有内容。所以,从上面的字符串我需要:

NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor

看到很多例子,但没有一个真正适合这项任务。

sql postgresql text-parsing
4个回答
0
投票
select array_to_string((string_to_array('1:723:NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor', ':'))[3:], ':');

NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor

这使用了这里的

string_to_array

https://www.postgresql.org/docs/current/functions-string.html

string_to_array(字符串文本,分隔符文本[,null_string文本])→文本[]

在出现分隔符处拆分字符串,并将结果字段形成文本数组。如果 delimiter 为 NULL,则字符串中的每个字符将成为数组中的单独元素。如果分隔符是空字符串,则该字符串将被视为单个字段。如果提供了 null_string 并且不为 NULL,则与该字符串匹配的字段将替换为 NULL。另请参阅 array_to_string。

string_to_array('xx~~yy~~zz', '~~', 'yy') → {xx,NULL,zz}

这会将字符串分解为各个组成部分,并从中创建一个数组。

[3:]
从数组中选择第三个到数组元素的末尾。

然后从这里开始:

https://www.postgresql.org/docs/current/functions-array.html

array_to_string(数组anyarray,分隔符文本[,null_string文本])→文本

将每个数组元素转换为其文本表示形式,并连接由分隔符字符串分隔的元素。如果给定 null_string 并且不为 NULL,则 NULL 数组条目由该字符串表示;否则,它们将被省略。另请参阅 string_to_array。

array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '') → 1,2,3,,5

这通过将数组元素与分隔符连接来重新构成字符串。


0
投票

这个返回一个数组,通过分割 :

上的内容
SELECT (regexp_split_to_array('1:723:NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor',':'))[3:];

如果您需要单个字符串:

SELECT array_to_string((regexp_split_to_array('1:723:NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor',':'))[3:], ':');

这个使用正则表达式来分割内容,并返回一个数组,但只有一个元素,很容易转换为单个字符串:

SELECT (regexp_matches('1:723:NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor', '^[^:]*:[^:]*:(.*)', 'g'))[1];

0
投票

下面演示了使用

NULLIF
REGEXP_REPLACE
以及正则表达式
^(([^:]*:){2}(.*))|(.*)
来提取字符串中第二个
:
之后出现的部分,或者如果第二个
NULL
之后没有字符则提取
:
:

WITH
  test_cases (id, test_value, expected_result) AS (
    VALUES
      (1, NULL, NULL),
      (2, '', NULL),
      (3, '1:', NULL),
      (4, '1:2:', NULL),
      (5, '1:2: ', ' '),
      (6,
       '1:723:NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor',
        'NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor'
      )
  ),
  runs AS (
    SELECT
      tc.id,
      tc.test_value,
      tc.expected_result,
      NULLIF(
        REGEXP_REPLACE(tc.test_value, '^(([^:]*:){2}(.*))|(.*)', '\3'),
        ''
      ) AS actual_result
    FROM
      test_cases tc
  )
SELECT
  runs.id,
  runs.expected_result IS NOT DISTINCT FROM runs.actual_result AS passed,
  runs.actual_result
FROM
  runs
ORDER BY
  runs.id;

0
投票

最短的是

substring()
,带有正则表达式:

SELECT substring(my_string, '^.+?:.+?:(.*$)');

正则表达式解释:

^
...锚定到字符串的开头(可选)
.
...任何角色
+?
... 1 次或多次,非贪婪
:
...字面字符
(2次)
(.*$)
...任意字符0次或多次,贪婪;在捕获括号中

test=> SELECT substring('1:723:NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor', '^.+?:.+?:(.*$)');
                                     substring                                     
-----------------------------------------------------------------------------------
 NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor
(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.