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 9.5 - 查询嵌套 JSON 元素的数组长度
postgres 从 9.5 升级到 11 将连接更改为嵌套循环,使其非常慢
RDS postgres 从 9.4 升级到 9.5,CPU 卡在 100% 几个小时
Postgres Plus Advanced Server (PPAS) 9.5 是不是支持将属性更改(删除/添加)复合对象类型?