regexp_replace中的psql大写反向引用字符串

时间:2013-05-14 12:04:04

标签: regex uppercase psql backreference

我有一个字符串,以前是用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

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

  • 第1步
    在第一步中,此功能将标记(我选择$$作为标记,但您可以使用任何。)ulica的一部分是大写的,如下所示:
    regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2$$\3$$\4' , 'g')
  • 第2步
    在第二步中,遍历结果字符串,并将每个字符放在两个标记之间。