【问题标题】:Postgres: regexp_replace & trimPostgres:正则表达式替换和修剪
【发布时间】:2017-01-18 11:16:31
【问题描述】:

我需要删除字符串末尾的“.0”,但我有一些问题。

PG 8.4 中我有这个表达式,它运行良好。

select regexp_replace('10.1.2.3.0', '(\\\\.0)+$', '');

结果是

'10.1.2.3' - 好结果。

但是PG更新到9.x版本后结果是

'10.1.2.3.0' - 输入字符串,它不正常。

我也尝试使用修剪功能

这种情况没关系

select trim('.0' from '10.1.2.3.0');

结果是 '10.1.2.3' - 好的

但是当我在代码末尾有 10 个时,我得到了意想不到的结果

select trim('.0' from '10.1.2.3.10.0');

select trim('.0' from '10.1.2.3.10');

结果是 10.1.2.3.1 - 0 是从 10 修剪的

有人可以建议我解决方案并解释 trim 功能有什么问题,以及最新版本中 regexp_replace 的变化是什么?

【问题讨论】:

    标签: regex postgresql trim


    【解决方案1】:

    我建议这样做:

    select (case when col like '%.0' then left(col, length(col) - 2)
                 else col
            end)
    

    这适用于所有版本的 Postgres,您无需担心正则表达式解析。

    至于正则表达式版本,这两个都对我有用(在 Postgres 的最新版本上):

    select regexp_replace('10.1.2.3.0', '(\.0)+$', '');
    select regexp_replace('10.1.2.3.0', '([.]0)+$', '');
    

    我怀疑早期版本的问题是使用反斜杠转义字符解析字符串 - 您可以使用方括号代替反斜杠,并且该模式应该适用于任何版本。

    【讨论】:

    • 谢谢! :) 是的,问题在于反斜杠转义字符,它的行为在不同版本之间发生了变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多