使用正则表达式在 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 正则表达式替换 PHP 语言中的匹配