我们需要将全名转换为缩写名称,其中输入组合的变化如下:
INPUT:[可选标题] [forename或initial] [姓]
输出:[可选标题] [首字母] [姓]
在所有情况下,如上所示,输出将是 Mr A Smith (其中存在标题)或 A Smith (其中不存在)和我认为这最好用RegEx实现,但我不知道正确的语法是什么。
我自己尝试了一些,只得到混合(不正确)的结果。
作为一个说明;名字'可以'包含特殊字符,没有人有中间名;所以我们可以在名单中找一个名叫 James O'Reilly-Bond 的人,这将导致 J O'Reilly-Bond先生
这是用C#编程的
答案 0 :(得分:2)
虽然不使用正则表达式当然是一种选择,但我理解不想列出可能的标题。如果它总是2个名称或3个带有标题,则可以使用(([A-Z])\S*)(?=\s\S*$)
完成,如https://regex101.com/r/tR7kV2/1所示。
这个想法是你选择倒数第二个单词,单词是捕获组$ 1,它的大写字母 - 在捕获组$ 2中,你用$ 2替换你的匹配。
答案 1 :(得分:1)
不要使用正则表达式。将字符串拆分到空白区域然后独立地对每个组件进行推理要容易得多(如果第一个是Mr / Mrs / Ms,则忽略它,否则取第一个字母)。
答案 2 :(得分:0)
您可以使用正则表达式Demo来实现此目的:
((?:mr|ms) )?(.).* (.*)
标志为i
,不区分大小写,并使用三个组作为替换(您没有说明您正在使用哪种语言,所以我不能举一个例子)
第一组匹配最终标题,后跟空格并捕捉它。 第二组匹配第一个单词的第一个字母,第三个组匹配最后一个单词(姓氏)。第二组和第三组之间的字符匹配以匹配名称格式。