Postgres regex用于分隔多个可选匹配项

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

假设一个文本字段需要在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'
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
    子字符串(
    必须转义才能解析为文字点,否则它将匹配任何字符)
  • |
    -或
  • 3
    -a
    3
    char
  • |
    -或
  • 5
    -a
    5
    char
  • |
    -或
  • 1[50]
    -
    1
    后跟
    5
    0
    […]
    称为括号表达式,可以指定字符、字符范围甚至字符类)
  • |
    -或
  • 20
    -a
    20
    子字符串
  • |
    -或
  • N/A
    -A
    N/A
    子字符串
  • -捕获组结束

替换模式中的
\1
是一个(也称为(组)占位符),它引用了在组1中捕获的值。

我希望在这一级别的解释中有更多的正则表达式答案。谢谢