正则表达式 sub 如何替换数字流的前零,同时保留所有零流的最后一个零 (postgres)

how can regexp sub replace preceding zeros of stream of digits while keeping the last zero of a stream of all zeros (postgres)

提问人:daveg 提问时间:10/20/2023 最后编辑:Barmardaveg 更新时间:10/20/2023 访问量:50

问:

我想通过消除前面的零来规范化存储在 PG 表的 varchar 列中的十六进制数(我需要比较可能以不同方式表示的 vals)。很简单。但是,如果数字流都是零,我也想保留最后一个零。例。。。

create table foo (col1 varchar);
insert into foo (col1) values ('''h000123abc'),('''h123abc'),('''h0123abc'),('''h000000000');
select regexp_replace(regexp_replace(col1,'''h',''),'^0+','') from foo;
 regexp_replace 
----------------
 123abc
 123abc
 123abc

(4 rows)

正如你所看到的,实际的十六进制 val 有一个“'h”前缀,我必须去掉它。 我想在 val 为 0 的情况下保留单个 0。我希望最后一行是“0”。

我将在 PG 和 regexp 以及 regexp-replace 下提交这个,因为我希望直接的正则表达式 soln 会映射到 SQL func regexp_replace。

感谢您的帮助

postgresql 正则表达式替换

评论


答:

1赞 Barmar 10/20/2023 #1

使用表达式根据值是否全部为 0 执行不同的替换。CASE

SELECT CASE
        WHEN REGEXP_LIKE(col1, '^''h0+$') THEN '0'
        ELSE REGEXP_REPLACE(col1, '^''h0*', '')
    END AS new_col1
FROM foo

演示

也无需使用单独的调用来删除前导零。REGEXP_REPLACE()'h

1赞 Nick 10/20/2023 #2

您可以使用正则表达式,在行尾之前将前导与 匹配至少一个字符(这将防止删除 中的所有 s) 并将匹配项替换为空字符串:'h00'h0000

SELECT REGEXP_REPLACE(col1, '^''h0*(?=.+$)', '')
FROM foo

示例数据的输出:

regexp_replace
123ABC公司
123ABC公司
123ABC公司
0

db-fiddle 演示

1赞 The fourth bird 10/20/2023 #3

您可以使用捕获最后一个字符的捕获组,并在替换中使用该捕获组。

^''h0*(.)

正则表达式演示

SELECT REGEXP_REPLACE(col1, '^''h0*(.)', '\1')

输出

123abc
123abc
123abc
0