在最后一次出现“-”或“|”后截断字符串

Truncate string after the last occurrence of '- ' or '|'

我正在使用 Postgres,并且想删除最后一次出现的“-”或“|”之后的所有内容。这是我提出的查询:

select regexp_replace( title, E'(- |\|).+$', '') as title from articles

问题是像这样的字符串:

'Trump tweets in China - how, and why does it matter? - BBC News'

过早被截断:

'Trump tweets in China'

如何让它只在最后一次出现“-”之后删除后缀?

谢谢!

你可以试试这个:

select regexp_replace ('Trump tweets in China - how, and why does it matter? - BBC News',
    '[|-][^|-]*$', '')

基本上是说:

  • 一个|或一个-
  • 后跟字符串末尾既不是 | 也不是 - 的任意数量的字符

结果:

Trump tweets in China - how, and why does it matter? 

您可以匹配 space 和连字符或竖线符号,捕获它们,然后只匹配不等于捕获文本的字符串的其余部分:

(- |\|)(?:(?!).)+$

替换为</code>。必要时转义(您需要在 <code>E'...' 字符串中使用双重转义)。

详情

  • (- |\|) - - | 符号
  • (?:(?!).)+ - 任何字符 (.),出现 1 次或多次 (+),不启动 - 序列或不等于 | - 取决于捕获到第 1 组的内容。
  • $ - 字符串结尾。

参见regex demo