3

我有一个字符串,它之前用 initcap() 处理过,我想把它的大写部分。

具体来说 - 我想将可能出现的基本罗马数字大写。

更具体地说,我想替换

雅娜三世索别斯基格

亚娜三世索别斯基格

我想我可以使用某种上子字符串子查询组合来实现它,但我试图让它在单个 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

4

1 回答 1

1

简短回答
不幸的是,您尝试过的操作无法使用regexp_replace.

长答案
介绍
这行

regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2'||upper('q\3q')||'\4' , 'g')

相当于

regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2Q\3Q\4' , 'g')

如您所见,regexp_replace不会大写任何反向引用。

替代方法
您可以创建自己的函数,该函数采用ulicaas 参数并返回ulica大写的基本罗马数字。

  • 第 1 步
    在第一步中,此函数将标记(我选择$$作为标记,但您可以使用任何标记。)将 ulica 的部分大写,如下所示:
    regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2$$\3$$\4' , 'g')
  • 步骤 2
    在第二步中,遍历生成的字符串并将位于两个标记之间的每个字符大写。
于 2013-05-14T15:36:10.383 回答