regexp_replace POSTGRESQL

时间:2014-10-30 11:44:30

标签: regex postgresql

我有正则表达式的问题。

我想搜索这样的文字' A ' - (space, BIG SINGLE CHAR and SPACE)

SELECT regexp_replace(' A Text B Text C Text a Text', '(([ ]{1}[A-Z]{1,1}[ ]{1}))', ' \1 ', 'g')

所以一切都好,但是我想用小字符替换这个单个大字符。

SELECT regexp_replace(' A Text B Text C Text a Text', '(([ ]{1}[A-Z]{1,1}[ ]{1}))', lower(' \1 '), 'g')

不起作用。

如何在匹配的\1中使用函数,例如lower()来获取结果

a Text b Text c Text a Text

感谢。

2 个答案:

答案 0 :(得分:0)

使用正则表达式

((^|\s)[A-Z]\s)

查看其工作原理示例http://regex101.com/r/mK4dR9/2

答案 1 :(得分:0)

首先,关于你的正则表达式的一些注释:

  • [ ](单个空格)相同 - 单个字符不需要括号
  • {1}{1,1}已过时,这是默认行为(没有量词意味着一次)

让我们澄清一下:lower(' \1 ')评估为' \1 ' 之前您致电regexp_replace。因此,您的查询之间没有区别。

你无法用regexp_replace实现你想要的东西 - 你需要regexp_replace_eval之类的东西(用自定义函数转换替换),但这在PostgreSQL中不可用。

你可以做的最多的事情就是把原来的弦乐和音乐分开。替换分裂部分:

select substring(string_agg(lower(substring(p for :length)) || substring(p from :length + 1), '') from :length + 1)
from regexp_split_to_table(repeat(' ', :length) || :input, '(?=' || :pattern || ')') p

-- in your case

select substring(string_agg(lower(substring(p for 3)) || substring(p from 4), '') from 4)
from regexp_split_to_table('   ' || ' A Text B Text C Text a Text', '(?= [A-Z] )') p

注意:这只适用于固定长度的正则表达式模式。