Postgres 9.5 中使用 regexp_replace 的正向 Lookbehind

Posted

技术标签:

【中文标题】Postgres 9.5 中使用 regexp_replace 的正向 Lookbehind【英文标题】:Positive Lookbehind in Postgres 9.5 using regexp_replace 【发布时间】:2018-12-27 06:07:02 【问题描述】:

我有这样的值:1ST、2ND、FIRST,并且我只想在前面是数字的情况下删除“ST”和“ND”。

我正在运行 postgres 9.5,我在SQL Fiddle 中有一个积极的后视,但它只适用于 9.6

SELECT ex,
regexp_replace(ex, '(?<=[0-9]+)(TH|ST|ND|RD)', '', 'gi') as test 
FROM t1

除了使用这样的 CASE 语句之外,还有其他方法可以做到这一点:

SELECT ex,
(CASE WHEN ex ~ '\d(TH|ST|ND|RD)' THEN regexp_replace (ex, 'TH|ST|ND|RD', '','gi') ELSE ex end) as test_case
FROM t1

任何建议将不胜感激。谢谢!

【问题讨论】:

下面我的回答有帮助吗?如果您需要任何调整,请提供反馈 这太好了,谢谢!我对反向引用和单词边界都很陌生。因此,您基本上使用正向前瞻 (?:TH|ST|ND|RD) 来匹配和捕获,然后将整个事物替换为对数字 ([0-9]) 的反向引用。再次感谢! (?:TH|ST|ND|RD) 是一个 non-capturing group,它不会创建特殊的内存缓冲区并且您不能反向引用。那么,你是对的。 【参考方案1】:

您可以匹配并捕获该数字并替换为对该值的反向引用。另外,我建议在序数数字后缀之后添加一个单词边界,以确保我们在单词末尾匹配它们。

SELECT regexp_replace(ex, '([0-9])(?:TH|ST|ND|RD)\y', '\1', 'gi') as test_case FROM t1

请参阅updated SQLFiddle。

CREATE TABLE t1
    (ex varchar)
;

INSERT INTO t1
    (ex)
VALUES
    ('1ST'),
    ('2ND'),
    ('3RD'),
    ('4TH'),
    ('FIRST'),
    ('FOURTH')
 ;

SELECT regexp_replace(ex, '([0-9])(?:TH|ST|ND|RD)\y', '\1', 'gi') as test_case FROM t1

【讨论】:

以上是关于Postgres 9.5 中使用 regexp_replace 的正向 Lookbehind的主要内容,如果未能解决你的问题,请参考以下文章

Postgres-XL9.5r1.6 搭建

Postgres-XL-9.5 集群部署测试

Postgres 9.5 - 查询嵌套 JSON 元素的数组长度

postgres 从 9.5 升级到 11 将连接更改为嵌套循环,使其非常慢

RDS postgres 从 9.4 升级到 9.5,CPU 卡在 100% 几个小时

Postgres Plus Advanced Server (PPAS) 9.5 是不是支持将属性更改(删除/添加)复合对象类型?