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