如何使用 regexp_replace 仅替换捕获组而不是完整匹配字符串

Posted

技术标签:

【中文标题】如何使用 regexp_replace 仅替换捕获组而不是完整匹配字符串【英文标题】:How to use regexp_replace to replace only the capturing group and not the full matching string 【发布时间】:2016-11-16 07:45:23 【问题描述】:

我们在数据库中有一列包含类似于“150 W 96 Th St”和“4514 282 Nd St”的值。您可能已经注意到,数字街道名称和后缀之间有一个空格,即“96 TH”。

我正在尝试编写一个删除该空间的 postgresql 查询。使用以下内容:

SELECT regexp_matches('150 W 96 Th St', ' \d+( )(?:St|Nd|Rd|Th) ')

我明白了:

" "

表示只返回捕获组。

但是,当我运行时

SELECT regexp_replace('150 W 96 Th St', ' \d+( )(?:St|Nd|Rd|Th) ', '')

我明白了

150 WSt

整个匹配字符串被替换。

我也试过

SELECT regexp_replace('150 W 96 Th St', ' \d+( )(?:St|Nd|Rd|Th) ', '\1')

我认为它只会替换第一个捕获组。

我还应该尝试什么?

【问题讨论】:

【参考方案1】:

将捕获组放在要保留的东西周围,然后在替换字符串中引用它们。

SELECT regexp_replace('150 W 96 Th St', '(\d+) (St|Nd|Rd|Th)', '\1\2')

【讨论】:

以上是关于如何使用 regexp_replace 仅替换捕获组而不是完整匹配字符串的主要内容,如果未能解决你的问题,请参考以下文章

Postgres regexp_replace:无法用第一个捕获的组替换源文本

如何仅替换捕获的组?

如何使用 REGEXP_REPLACE 替换特定条件下的重复单词?

如何使用 REGEXP_REPLACE 检查字符串中是不是存在值“已关闭”并替换

在 Hive 中,如何使用“regexp_replace()”对标记值执行通配符搜索,以将其替换为公共值?

使用 regexp_replace 如何用异常替换字符串