使用regexp_replace在Postgres 9.5中正向后看

时间:2018-07-19 07:38:17

标签: regex postgresql regex-lookarounds regexp-replace

我具有这样的值: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

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

1 个答案:

答案 0 :(得分: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

enter image description here