gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:00:44 27 4
gpt4 key购买 nike

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

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

更具体地说,我想替换

Jana Iii Sobieskiego

Jana III Sobieskiego

我想我可以使用某种 upper-substring-subquery 组合来实现它,但我试图让它在单个 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

最佳答案

简短回答
不幸的是,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

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

关于regex - regexp_replace 中的 psql 大写反向引用字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542662/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com