【问题标题】:Find LETTERS-NUMBER pairs in postgres using regex使用正则表达式在 postgres 中查找 LETTERS-NUMBER 对
【发布时间】:2021-08-28 13:42:07
【问题描述】:

我需要将 TEXT1-NUMBER 替换为 TEXT2-NUMBER。 示例“这些是 TEXT1-123 和 TEXT1-456 示例”应替换为“这些是 TEXT2-123 和 TEXT2-456 示例”。

我可以使用替换大多数情况

Regexp_Replace(column_name, '(\mTEXT1)(-[0-9]+\M)', 'TEXT2\2', 'g') 

但它也替代了一些我想排除的情况,比如

  • TEXT1-NUMBER-NUMBER
  • TEXT3-NUMBER-TEXT1-NUMBER

如何让它只匹配精确的 TEXT-NUMBER 对?

谢谢。

【问题讨论】:

    标签: regex postgresql regexp-replace


    【解决方案1】:

    你可以使用

    SELECT REGEXP_REPLACE(column_name,
                          '(\s|^)TEXT1(-[0-9]+)(?!\S)',
                          '\1TEXT2\2', 'g') AS Result;
    

    请参阅regex demo

    从 PostgreSQL 10 开始,支持lookbehinds,然后你也可以使用REGEXP_REPLACE(column_name, '(?<!\S)TEXT1(-[0-9]+)(?!\S)', 'TEXT2\1', 'g')

    正则表达式详细信息

    • (\s|^) - 第 1 组(\1 指此值):空格或字符串开头
    • TEXT1 - 静态字符串 -(-[0-9]+) - 第 2 组(\2 指此值):- 和一位或多位数字
    • (?!\S) - 如果当前位置右侧没有非空白字符,则匹配失败。

    【讨论】:

    • 谢谢。它在大多数情况下都有效。我发现了一些不匹配的情况,当搜索的字符串在括号、引号之间或后跟逗号或点时。这些是示例 (TEXT1-123) 和 TEXT1-456,示例 (TEXT1-123)、“TEXT1-3423”和 TEXT1-895。根据您的正则表达式,我尝试了(\s|^|\(|\"|\.|\,)TEXT1(-[0-9]+)([\)|\"|\.|\,]*)(?!\S),但也许有更好的方法。字符串 TEXT1-NUMBER 可以是普通文本中的任何位置。
    • Postgres 9.6.20
    • 我在 PostgreSQL 9.5 中测试过,SELECT REGEXP_REPLACE(column_name, '(\s|^)TEXT1(-[0-9]+)(?!\S)', '\1TEXT2\2', 'g') AS Result; 必须工作。
    猜你喜欢
    • 2011-05-09
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    相关资源
    最近更新 更多