Postgres使用regexp_replace在特定位置匹配字符并替换

时间:2019-03-12 15:13:42

标签: regex string postgresql replace

我需要检查字符串的前2个字符是否与“ 00”,“ 01”或“ 02”匹配,并分别替换为“ 24”,“ 25”或“ 26”。

例如替换

'02:00:00' with  '26:00:00'

我尝试:

SELECT replace(replace(replace('01:01:00'::varchar, '00:', '24:'),'01:', '25:'), '02:', '26:')

不起作用,因为它返回:

"25:25:00"

我只希望前2个字符符合条件:

"25:01:00"

也许regexp_replace是正确的方法,但我找不到解决方法。

2 个答案:

答案 0 :(得分:2)

这是我先前的Oracle示例的PostgreSQL版本,在逻辑上做同样的事情。有时您需要进行RTFM! :-) 它使用substring()函数返回第一个组中的第一个元素,该函数经过测试,与您要替换的值交换,并与第二个substring()调用中返回的字符串的其余部分串联

select 
  case substring(str from '^(\d{2}:)')
    when '00:' then '24:'
    when '01:' then '25:'
    when '02:' then '26:'
    else substring(str from '^(\d{2}:)')
  end || substring(str from '^\d{2}:(\d{2}:\d{2})$') as fixed
from tbl;

SQL Fiddle example

More regex info

答案 1 :(得分:1)

select regexp_replace('01:01:03', '([0-9]{2})(:[0-9]{2}:[0-9]{2})', 'aa\2');

分为两组,第一组包含2个数字,第二组包含其他所有内容。替换表示打印新字符串,其他所有内容/第二组。

更新

感谢@franco_b。这是更新一些条目的版本:

select(regexp_replace('01:01:03','([[0-9] {2})(:[0-9] {2}:[0-9] {2})','\ 1'):: int + 24):: text || regexp_replace('01:01:03','([[0-9] {2})(:[0-9] {2}:[0-9 ] {2})','\ 2');