代码之家  ›  专栏  ›  技术社区  ›  kambi

截断上次出现“-”或“|”后的字符串

  •  3
  • kambi  · 技术社区  · 7 年前

    我正在使用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'
    

    如何使其仅在最后一次出现“-”之后删除后缀?

    谢谢

    2 回复  |  直到 7 年前
        1
  •  4
  •   Hambone    7 年前

    您可以尝试以下操作:

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

    基本上是说:

    • | 或a -
    • 后跟任意数量的字符,这些字符既不是 | 也不是a - 在字符串的末尾

    结果:

    Trump tweets in China - how, and why does it matter? 
    
        2
  •  1
  •   Wiktor Stribiżew Cristian Lupascu    7 年前

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

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

    替换为 \1 . 必要时退出(您需要在中使用双退出 E'...' 字符串)。

    细节

    • (- |\|) -要么是a - 或a | 象征
    • (?:(?!\1).)+ -任何字符( . ),1次或多次出现( + ),这不会启动 - 序列或不等于 | -取决于第1组中捕获的内容。
    • $ -字符串结尾。

    请参见 regex demo .