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

Postgres Regex_Replace : using pattern in replace string

要求 我的要求是检查一个人的名字是否包含 Initials ,将其替换为该字母和句点的大写字母。对于我的要求,首字母始终是单字母名称,或者是 space.

之前或之后名称中的单字母字符串

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

得到的字符串
select REGEXP_REPLACE(first_name,'\y[(A-Z)(a-z)]\y',upper(|| '.'),'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')

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

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

字符 class [[:alpha:]] 匹配所有字母字符,包括重音字符。在它的两侧加上 \y 确保我们只匹配一个。 (?!\.) 是一个 negative lookahead 检查它是 不是 后跟一个 . 而不消耗匹配中的 . ,避免加倍向上。包围起来() 来捕捉它

然后替换为捕获的字符,Postgres使用</code>,带点。</p> <p>将结果输入 <code>initcap 以修正大小写。

Try it.