我有一个字符串,以前是用initcap()处理过的,我想要大写它的一部分。
具体 - 我希望大写可能出现的基本罗马数字。
更具体地说,我想替换
Jana Iii Sobieskiego
到
Jana III Sobieskiego
我想我可以使用某种上子字符串子查询组合来实现它,但我试图让它在单个regexp_replace中工作,如下所示:
SELECT
ulica
--, regexp_matches(ulica , '((^|\s)([XxIiVv]+)(\s|$))', 'g')
, regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2'||upper('q\3q')||'\4' , 'g')
FROM (
SELECT unnest(ARRAY['Jana Iii Sobieskiego', 'Xx Lecia', 'Xxx Lecia Panowania Zygmunta Iii Wazy'])::text AS ulica
) AS src
会发生什么,上层是替换字符串(q ... q)的“静态”部分,而不是反向引用。
我得到了
Jana QIiiQ Sobieskiego
任何人都知道如何做到这一点?
PostgreSQL 9.1
答案 0 :(得分:0)
简短回答
不幸的是,regexp_replace
无法实现您的尝试。
LONG ANSWER
的 INTRO 强>
这一行
regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2'||upper('q\3q')||'\4' , 'g')
相当于
regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2Q\3Q\4' , 'g')
正如您所看到的,regexp_replace
不会出现任何反向引用。
解决方法强>
您可以创建自己的函数,将ulica
作为参数,并返回基本罗马数字大写的ulica
。
$$
作为标记,但您可以使用任何。)ulica的一部分是大写的,如下所示:regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2$$\3$$\4' , 'g')