从字符串中删除动态链接

时间:2013-12-03 16:32:10

标签: regex string postgresql replace postgresql-9.3

在Postgres数据库(9.3)中,我有类似这样的字符串,我打算删除这些链接:

'HV 3 STANKOVERLAST (+Inc,net: reg.inmeld+) , J.J. Cremerplein 46 AMSTERDAM [ ASD ] http:\/\/t.co\/qzmyMibvHn #p2000'
'A1 13105 AMSTERDAM Bickersgracht 270 http:\/\/t.co\/4oX6B5oAo4 #p2000'
'A1 13157 AMSTERDAM Argonautenstraat 54 3 http:\/\/t.co\/mmyjBcWEFY #p2000'
'A1 13122 AMSTERDAM Tweede Helmersstraat 6 Hotel Crystal http:\/\/t.co\/BWGj4R1noh #p2000'

要删除它们,我使用了:

split_part(text, 'http', 1)

不幸的是,并非所有这些都与链接最终构建方式相同:

'BR 2 BUITENBRAND (+http:\/\/t.co\/1x4jPyfA9e: reg.inmeld+) Ferdinand Bolstraat , Quellijnstraat AMSTERDAM [ ASD ] #p2000 #watiserloos'

在这里使用split_part()会删除此字符串的大部分内容

我已经找了一些正则表达式函数,但找不到这些动态链接的解决方案。

1 个答案:

答案 0 :(得分:1)

通常情况下,regexp_replace() or substring()regular expressions一起使用可以剪切字符串中的大部分内容,只要您能清楚地定义它。

在您的情况下,例如:

SELECT regexp_replace(string, 'http:[^[:space:]]+(:?\s*#p\d+)?', '') AS trimmed

或者更简单,根据你后来的评论:

  

以http开头的字符串部分直到下一个空格

(或字符串的结尾,我可以添加)

SELECT regexp_replace(string, 'http:[^[:space:]]+', '') AS trimmed

替换第一次出现的模式。添加global switch 'g',如果可以的话。

-> SQLfiddle

解释

[^[:space:]] ..所有非空白字符的字符类 ^ ..否定班级 [:space:] ..空格characters as defined by your locale的字符类。 将以http:开头的任何部分剪切到下一个空格字符。另外,可选地,悬挂#p后跟一个数字 + ..一个或多个原子

根据最近的相关问题进行了更多解释:
Regex failing to match number and dash with letter (or space and letter)