Postgres regex用于分隔多个可选匹配项
假设一个文本字段需要在PostgreSQL中进行分隔。它的格式为Postgres regex用于分隔多个可选匹配项,regex,postgresql,Regex,Postgresql,假设一个文本字段需要在PostgreSQL中进行分隔。它的格式为'abcd',其中每个变量可以是以下任意一种:1.4,3,5,10,15,20或N/A。下面是一个带有一些示例的查询,后面是它们的预期结果: WITH example AS( SELECT '10N/AN/AN/A' AS bw UNION SELECT '1010N/AN/A' UNION SELECT '101020N/A' UNION SELECT '35N/A1.4' UNION SELECT '1010N/A10' UNI
'abcd'
,其中每个变量可以是以下任意一种:1.4
,3
,5
,10
,15
,20
或N/A
。下面是一个带有一些示例的查询,后面是它们的预期结果:
WITH example AS(
SELECT '10N/AN/AN/A' AS bw
UNION SELECT '1010N/AN/A'
UNION SELECT '101020N/A'
UNION SELECT '35N/A1.4'
UNION SELECT '1010N/A10'
UNION SELECT '105N/AN/A'
UNION SELECT '1.43N/A20'
)
SELECT
bw
,regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(
regexp_replace(bw, '(1\.4)', E'\\&|', 'g')
, '(3)', E'\\&|', 'g')
, '(5)', E'\\&|', 'g')
, '(10)', E'\\&|', 'g')
, '(15)', E'\\&|', 'g')
, '(20)', E'\\&|', 'g')
, '(N/A)', E'\\&|', 'g')
FROM
example
结果:
bw:text, regexp_replace:text
'1010N/AN/A', '10|10|N/A|N/A|'
'1010N/A10', '10|10|N/A|10|'
'35N/A1.4', '3|5|N/A|1.4|'
'1.43N/A20', '1.4|3|N/A|20|'
'105N/AN/A', '10|5|N/A|N/A|'
'101020N/A', '10|10|20|N/A|'
'10N/AN/AN/A','10|N/A|N/A|N/A|'
我不担心拖管,因为我能处理它。这让我得到了我想要的,但我担心我能做得更简洁。在浏览文档时,我尝试将每个捕获组放在一个regexp_replace语句中,但没有得到这些结果
这可以在单个regexp|u replace语句中实现吗?您可以构建一个(1\.4 | 3 | 5 | 1[50]| 20 | N/a)
,将替代项分开并替换为\1
:
select regexp_replace('35N/A1.4', '(1\.4|3|5|1[50]|20|N/A)', '\1|','g');
-- 35|N/A|1.4|
见
详细信息
-启动捕获组构造(
-1\.4
子字符串(1.4
必须转义才能解析为文字点,否则它将匹配任何字符)
-或|
-a3
char3
-或|
-a5
char5
-或|
-1[50]
后跟1
或5
(0
称为括号表达式,可以指定字符、字符范围甚至字符类)[…]
-或|
-a20
子字符串20
-或|
-AN/A
子字符串N/A
-捕获组结束)
替换模式中的
\1
是一个(也称为(组)占位符),它引用了在组1中捕获的值。我希望在这一级别的解释中有更多的正则表达式答案。谢谢