Postgres Regex_Replace:在替换字符串中使用模式

Posted

技术标签:

【中文标题】Postgres Regex_Replace:在替换字符串中使用模式【英文标题】:Postgres Regex_Replace : using pattern in replace string 【发布时间】:2021-02-14 02:14:15 【问题描述】:

要求 我的要求是检查一个人的姓名是否包含 Initials ,将其替换为该字母和句点的 Caps 。对于我的要求,姓名首字母始终是单字母名称,或者名称中的单字母字符串在空格之前或之后。

挑战 我正在使用 REGEXP_REPLACE 并使用 \y 在单词边界内搜索单个字符。这工作正常,但现在我需要在替换字符串中使用相同的字符并将其设为大写并添加句点。基本上下面查询中的 $1 应该替换为我从模式 \y[(A-Z)(a-z)]\y

得到的字符串
select REGEXP_REPLACE(first_name,'\y[(A-Z)(a-z)]\y',upper($1|| '.'),'g' )from public.regextest

样本数据

Below is table of sample data and code to create sample data

first_name  Suggested value
A           A.
H M         H. M.
Lars E      Lars E.
Jo          Jo
BO          Bo
X X X       X. X. X.
M HAMED     M. HAMED
M P Rajan   M. P. Rajan
Rajan M P   Rajan M. P.

以下是创建示例数据的代码。

create table public.regextest( first_name varchar(100))
insert into  public.regextest values ( 'A')
,('H M')
,('Lars E')
,('Jo')
,('BO')
,('X X X')
,('M HAMED')
,('M P Rajan')
,('Rajan M P')

【问题讨论】:

您的示例名字都没有小写字母。我猜Lars e 会是Lars E.?感谢您提供示例数据。 【参考方案1】:

进行替换,然后使用initcap 将每个单词的首字母大写。

select
  initcap(
    regexp_replace(first_name, '\y([[:alpha:]])\y(?!\.)', '\1.','g')
  )
from public.regextest

字符类[[:alpha:]] 匹配所有字母字符,包括重音字符。将其与\y 放在一起确保我们只匹配一个。 (?!\.) 是 negative lookahead 检查它是否 not 后跟 . 而不会在匹配中消耗 .,从而避免加倍。它被() 包围以捕获它。

然后替换的是捕获的字符,Postgres 使用\1,带有一个点。

将结果输入initcap 以修正大小写。

Try it.

【讨论】:

非常感谢,您提供的解决方案对我有用! 我观察到的一个问题是名称中已经有句点。像 A. 这样的东西被替换为 A.. ,我们怎样才能避免这种情况?我们显然可以编写另一个替换语句并将所有 .. 替换为单个 .但这可能不是最好的方法。 @Vivek 很好的观察。它需要一个 negative lookahead 来发现 . 而不消耗它。

以上是关于Postgres Regex_Replace:在替换字符串中使用模式的主要内容,如果未能解决你的问题,请参考以下文章

我只想将 regex_replace 用于第一个字符(电话号码)

如何在 regex_replace() 中使用 db 列名 - presto

Oracle regex_replace 不排除某些值

尝试使用 regex_replace 提取数字

解码为希伯来语时不正确的 regex_replace

Oracle:是不是有支持内联代码的 REGEX_REPLACE 变体?