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 用于第一个字符(电话号码)