Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgres Regex_Replace:在Replace字符串中使用模式_Regex_Postgresql_Regexp Replace - Fatal编程技术网

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

Postgres Regex_Replace:在Replace字符串中使用模式,regex,postgresql,regexp-replace,Regex,Postgresql,Regexp Replace,要求 我的要求是检查一个人的名字是否包含首字母,用大写字母和句号替换。根据我的要求,姓名的首字母将始终是单字母名称,或名称中空格前后的单字母字符串 挑战 我正在使用REGEXP\u REPLACE并使用\y搜索单词边界内的单个字符。这很好,但现在我需要在替换字符串中使用相同的字符,使其大写并添加句点。基本上,下面查询中的$1应该替换为从模式\y[(A-Z)(A-Z)]\y中获得的字符串 样本数据 Below is table of sample data and code to create s

要求 我的要求是检查一个人的名字是否包含首字母,用大写字母和句号替换。根据我的要求,姓名的首字母将始终是单字母名称,或名称中空格前后的单字母字符串

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

样本数据

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')

进行替换,然后使用将每个单词的第一个字母大写

select
  initcap(
    regexp_replace(first_name, '\y([[:alpha:]])\y(?!\.)', '\1.','g')
  )
from public.regextest
字符类与所有字母字符(包括重音字符)匹配。在它的两侧加上
\y
可以确保我们只匹配一个
(?!\)
是一种检查,在匹配中不使用
的情况下,检查后面是否紧跟着
,以避免重复。它被
()
包围以捕获它

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

将结果输入到
initcap
以修复大小写


.

您的样本名字都没有小写。我想
larse
应该是
larse.
?感谢您提供的示例数据。非常感谢,您提供的解决方案适合我!我观察到的一个问题是,当名称中已经有句点时。类似于A的东西被替换为,我们如何避免这种情况?显然,我们可以编写另一个replace语句并替换所有。。一个单身汉。“但这可能不是最好的方法。”维韦克说,这是一个很好的观察。它需要一个标签来识别
,而不使用它。
select
  initcap(
    regexp_replace(first_name, '\y([[:alpha:]])\y(?!\.)', '\1.','g')
  )
from public.regextest