使用正则表达式在 postgres 中查找 LETTERS-NUMBER 对

Posted

技术标签:

【中文标题】使用正则表达式在 postgres 中查找 LETTERS-NUMBER 对【英文标题】:Find LETTERS-NUMBER pairs in postgres using regex 【发布时间】: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 对?

谢谢。

【问题讨论】:

【参考方案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; 必须工作。

以上是关于使用正则表达式在 postgres 中查找 LETTERS-NUMBER 对的主要内容,如果未能解决你的问题,请参考以下文章

如何使用动态正则表达式匹配 Postgres 中的值

来自 Postgres 正则表达式替换 PHP 语言中的匹配

正则表达式使用 postgres regexp_replace() 用单引号替换反斜杠和单引号

Postgres 正则表达式替换不起作用

postgres 与正则表达式匹配

postgres 按正则表达式切割并取值