我有一个要求,即人员可以有多个名字,我需要将姓名从 2 个或更多大写字母的名字转换为第一个字符。
例子:
Srinivas Kalyan ,Sai Kishore
如果以上是有 4 个名字的人,那么我需要显示如下
S K S K
逗号也被替换并取所有第一个字符
2. Srinivas-Kalyan Sai Kishore
对于上述名称,值应为
S S K
因为斯里尼瓦斯-卡利扬被认为是一个名字
名称也可以是小写字母
srinivas kalyan sai kishore
为此
S K S K
这必须在预言机中
尝试了以下regex_replace,它在sql开发人员中工作正常,但在应用程序中它正在变为空间
replace(trim(regexp_replace(to_char(regexp_replace(initcap(regexp_replace(regexp_replace
(FIRST_NAME, '[0-9]', ''), '( *[[:punct:]])', '')), '([[:lower:]]| )')), '(.)', '1 ')),',',null)
输出中缺少的字母是由此字符删除正则表达式引起的:
( *[[:punct:]])
这会Kalyan ,Sai
变成KalyanSai
,其余过程将被视为一个单词,因此输出中不会有 S of Sai。
我建议这个简短的表达方式:
trim(upper(regexp_replace(
regexp_replace(first_name, '([[:alpha:]])(-|[[:alpha:]])+', '1'),
'.*?([[:alpha:]]|$)', ' 1'
)))
解释
([[:alpha:]])(-|[[:alpha:]])+
->1
这会将任何字母序列(或连字符)替换为其中的第一个。因此,它将单词简化为首字母。
.*?([[:alpha:]]|$)
->(space)1
这会用空格替换下一个字母之前的任何内容。由于不会跳过任何字母(因为
.*?
是非贪婪的),这有效地将所有非字母序列替换为空格。为了替换末尾的非字母(不在字母之前),添加了特殊情况$
(字符串结尾)作为替代。
在这两个步骤之后,剩下的就是:
- 大写一切
- 使用
trim
删除结果开头和结尾的空白
我发现这种方法的优点是它不使用除[[:alpha]]
以外的任何其他类。数字、标点符号、小写或其他任何东西都不需要明确标识,因为它只是对[[:alpha]]
的否定。唯一必须做的例外是连字符。
由于某些名称可能包含其他一些非字母(如引号),因此您可能还希望在第一个正则表达式中添加此类字符。