我有正则表达式的问题。
我想搜索这样的文字' 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
?
感谢。
答案 0 :(得分:0)
答案 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
但注意:这只适用于固定长度的正则表达式模式。