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

问题描述

要求 我的要求是检查一个人的名字是否包含姓名缩写,然后用该字母和大写字母的大写字母替换。根据我的要求,姓名的首字母始终应该是字母,也可以是空格前后的单个字母字符串。

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

中获得的字符串
pow

样本数据

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.

解决方法

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

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

字符类[[:alpha:]]与所有字母字符匹配,包括带重音符号的字符。在侧面加上\y可确保我们仅匹配一个。 (?!\.)negative lookahead,用于检查是否不是,然后是.,而不消耗比赛中的.,从而避免加倍。它被()包围以捕获它。

然后替换为捕获的字符,Postgres使用\1,并带有点。

将结果输入initcap中以固定大小写。

Try it

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...