我有几个这样的字符串:
1:723:NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor
我需要返回第二个冒号(
:
)之后的所有内容。所以,从上面的字符串我需要:
NVDA:NSDQ::Z4189274321:Snapshot Report:10:COMPUTER & TECHNOLOGY:241:Semiconductor
看到很多例子,但没有一个真正适合这项任务。
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
这通过将数组元素与分隔符连接来重新构成字符串。
这个返回一个数组,通过分割 :
上的内容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];
下面演示了使用
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;
最短的是
substring()
,带有正则表达式:
SELECT substring(my_string, '^.+?:.+?:(.*$)');
正则表达式解释:
^
...锚定到字符串的开头(可选).
...任何角色+?
... 1 次或多次,非贪婪:
...字面字符(.*$)
...任意字符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)