2012-07-30 29 views
26

我有一個表,其中包含大量包含URL的列的行。該URL的形式爲:正則表達式在Postgres中查找和替換

http://one.example1.com:9999/dotFile.com

我想與http://example2.com/dotFile.com,以取代在該列中的所有比賽,同時保持後一切:9999。我找到了關於regexp_matches和regexp_replace的一些文檔,但是我無法完全理解它。

回答

27

如果你知道的網址,你不必使用正則表達式。替換()函數應該爲你工作:

replace(string text, from text, to text)   
Replace all occurrences in string of substring from with substring to 
example: replace('abcdefabcdef', 'cd', 'XX') abXXefabXXef 

你可以嘗試:

replace(yourcolumn, 'one.example1.com:9999','example2.com') 
+1

+1:

要更換一個動態字符串,你可以使用regexp_replace()這樣。 – Tomalak 2012-07-30 14:05:55

+5

謝謝,這個伎倆。 更新表 SET字段= 替換(field,'one.example1.com:9999','example2.com') – ringocub 2012-07-30 14:35:55

40

要更換一個固定的字符串,使用簡單replace()功能。對於務實的態度

UPDATE 
    YourTable 
SET 
    TheColumn = regexp_replace(
    TheColumn, 'http://[^:\s]+:9999(\S+)', 'http://example2.com\1', 'g' 
) 
+8

'replace()'在這裏做了一個更簡單的工作,因爲您已經評論過自己了。但是,要用'regexp_replace()'替換「all matches」,則必須爲「全局」添加第4個參數''g'' .. .. – 2012-07-30 16:18:56

+0

@Erwin感謝您的提示。我已經包括了這一點。 – Tomalak 2012-07-30 16:25:36

+0

我正在尋找一個我可以在'UPDATE ... WHERE'email'= regexp_matches(「email」,E',[co.tz]')'where'子句中使用的篩選和提高更新速度的工具。但是這也沒問題,因爲我只在開發過程中這樣做過一次。謝謝,因爲我真的想要一個'regexp'解決方案。 :) – ArchNoob 2017-03-18 13:37:06

相關問題