2013-05-14 17 views
2

我有一個字符串,這是以前用initcap()處理,我想它的大寫部分。psql大寫反向引用字符串regexp_replace

具體說明 - 我想輸入大寫的基本羅馬數字。

爲了更具體些,我想更換

賈納㈢Sobieskiego

賈納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。問),但不是反向引用。

我得到

賈納QIiiQ Sobieskiego

任何人有一個想法如何做到這一點?

的PostgreSQL 9.1

+0

你是如何解決這個問題的?在這一刻我會去做一個解決方法。對不起@Stephan沒有確認你的答案,我只是更容易接受我的系統 – 2016-02-22 21:39:51

+1

我沒有。似乎它不能完成。 – murison 2016-02-23 10:04:11

+0

感謝您的評論!這對後天有好處。我想知道Postgres的最新版本是否發生了變化。乾杯 – 2016-02-23 16:48:23

回答

0

簡短的回答
不幸的是,你已經嘗試是不可能的regexp_replace

長的答案
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
    在第二步驟中,經過將所得的字符串和大寫位於兩個標記之間的每個字符。