【问题标题】:psql uppercase backreferenced string in regexp_replaceregexp_replace 中的 psql 大写反向引用字符串
【发布时间】:2013-05-14 12:04:04
【问题描述】:

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

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

更具体地说,我想替换

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

发生的情况是,upper 作用于替换字符串 (q...q) 的“静态”部分,但不适用于反向引用。

我明白了

Jana QiiiQ Sobieskiego

有人知道怎么做吗?

PostgreSQL 9.1

【问题讨论】:

  • 你是怎么解决这个问题的?在这一刻,我会做一个解决方法。抱歉@Stephan 没有为我确认您的答案,在我的系统中接受小写字母更容易
  • 我没有。好像做不到。
  • 感谢您的评论!这对后验性有好处。我想知道这在 Postgres 的最新版本中是否发生了变化。干杯

标签: regex uppercase psql backreference


【解决方案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 不会大写任何反向引用。

解决方法
您可以创建自己的函数,将ulica 作为参数并返回ulica,基本罗马数字大写。

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

【讨论】:

    猜你喜欢
    • 2012-09-25
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2017-01-11
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多