要求 我的要求是检查一个人的名字是否包含姓名缩写,然后用该字母和大写字母的大写字母替换。根据我的要求,姓名的首字母始终应该是字母,也可以是空格前后的单个字母字符串。
挑战 我正在使用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.
答案 0 :(得分:0)
进行替换,然后使用initcap
将每个单词的首字母大写。
select
initcap(
regexp_replace(first_name, '\y([[:alpha:]])\y(?!\.)', '\1.','g')
)
from public.regextest
字符类[[:alpha:]]
与所有字母字符匹配,包括带重音符号的字符。在侧面加上\y
可确保我们仅匹配一个。 (?!\.)
是negative lookahead,用于检查是否不是,然后是.
,而不消耗比赛中的.
,从而避免加倍。它被()
包围以捕获它。
然后替换为捕获的字符,Postgres使用\1
,并带有点。
将结果输入initcap
中以固定大小写。