Postgres中的多线正则表达式替换

时间:2016-12-05 04:19:04

标签: regex postgresql

我正试图删除postgres中两个字幕之间的所有内容:

regexp_replace(text, 'caption1:[\S\s\n\r]+?:', '', 'ig') AS text

但是我收到了这个错误:

ERROR: invalid regular expression: invalid escape \ sequence
SQL state: 2201B

看起来它不允许我与\S (any non-whitespace character)

匹配

示例文字:

Lorem ipsum

Caption1:
I want this text to be removed.
And this line too.


Caption2:
Consectetuer adipiscing elit.

应该成为:

Lorem ipsum

Consectetuer adipiscing elit.

3 个答案:

答案 0 :(得分:1)

来自document

  

在括号表达式中,\ d,\ s和\ w会丢失其外括号,   和\ D,\ S和\ W是非法的。 (例如,[a-c \ d]是   相当于[a-c [:digit:]]。另外,[a-c \ D],相当于   [a-c ^ [:digit:]],是非法的。)

所以你的正则表达式应该是:

caption1:[^[:space:][:space:]\n\r]+?:

答案 1 :(得分:0)

如果要使用转义字符类,则需要两个反斜杠,例如使用\\s代替\s。但无论如何,我不认为你的逻辑真的需要这个。相反,您可以使用以下查询:

SELECT 'Caption1: ' || right(text, char_length(text) - position('Caption2' in text) + 1)
FROM yourTable

答案 2 :(得分:0)

[\S\s\n\r]无法在PostgreSQL中运行,因为此引擎不支持速记类似Perl的字符类(如\S\d,\ W , etc.) inside bracket expressions (i.e. inside [... ]`)。它们被解析为\和后面的字母。

您需要使用

regexp_replace(text, 'caption1:[^:]+:', '', 'ig') AS text

请注意,+是一个常规的贪心量词,可以匹配它修改的模式的一个或多个匹配项。量化模式为[^:]。它是一个字符类(或者也称为括号表达式),使用^之后的^字符否定[^:]。因此,:匹配以外的任何字符? 包括换行符。

+之后你不需要caption1:[^:]+:作为懒惰模式,在这种情况下,它将比贪婪版本慢。

因此,请使用caption1:

  • [^:]+ - 文字子字符串
  • : - 除:
  • 以外的1个或多个字符
  • : - 文字positions = windspeedalongblade;