【问题标题】:REGEX "Full Name" to "Abbreviated Name"正则表达式“全名”到“缩写名”
【发布时间】:2015-07-06 23:27:55
【问题描述】:

我们需要将全名转换为缩写名,其中输入的组合变化如下:

输入:[可选标题] [名字或首字母] [姓氏]

输出:[可选标题] [首字母] [姓氏]

  • 安德鲁·史密斯先生
  • 史密斯先生
  • 史密斯
  • 安德鲁·史密斯

在所有情况下,如上所示,输出将是 Mr A Smith(存在头衔)或 A Smith(不存在头衔)和我认为这最好使用 RegEx 来实现,尽管我不知道正确执行此操作的语法是什么。

我自己尝试了一些,但得到的结果好坏参半。

作为注释;名称“可能”包含特殊字符,并且没有人有中间名;这样我们就可以在列表中包含一个名为 Mr James O'Reilly-Bond 的人,这将导致 Mr J O'Reilly-Bond

这是用 C# 编写的

【问题讨论】:

  • 这个问题不恰当,没有足够的例子,没有描述冲突的案例,没有发布代码,也没有指定语言。
  • 它是用 C# 编写的,名称列表的示例数量几乎是问题的全部范围。
  • 您无法区分名称和头衔,例如杜克
  • @MrBones 虽然这是正确的,但我们没有任何头衔/姓氏实例,这意味着杜克约翰逊将始终是姓氏/姓氏。 Andris 的 RegEx 示例(如下)已经过测试,完全符合我们的要求,适用于我们知道可能发生的所有可能组合。
  • 我们怎么知道呢?这里有一大堆隐含的假设,这就是为什么我说这是一个不恰当的问题

标签: c# regex


【解决方案1】:

虽然不使用正则表达式当然是一种选择,但我知道不想列出可能的标题。如果标题总是 2 个或 3 个,则可以使用 (([A-Z])\S*)(?=\s\S*$),如 https://regex101.com/r/tR7kV2/1 所示。

这个想法是您选择倒数第二个单词,该单词在捕获组 $1 中,其大写字母 - 在捕获组 $2 中,您将匹配替换为 $2。

【讨论】:

    【解决方案2】:

    不要使用正则表达式。在空格上拆分字符串然后独立地对每个组件进行推理要容易得多(如果第一个是 Mr/Mrs/Ms,则忽略它,否则取第一个字母)。

    【讨论】:

    • 我曾考虑过类似的事情(仅提取第一项;有很多组合,例如:先生、夫人、小姐、博士等,并考虑拆分为如果 split().length = 3 我们知道我们有一个标题;如果它是 2 那么它只是名字/姓氏。认为使用 RegEx 会更快(处理冗长的列表)并且也更整洁。
    • 正则表达式通常比简单的字符串处理。他们不是魔法。 ;)
    • 我不同意这个答案,使用正则表达式很容易,并且比测试组的存在需要更少的语句
    【解决方案3】:

    您可以使用正则表达式Demo

    ((?:mr|ms) )?(.).* (.*)
    

    带有标志i 表示不区分大小写并使用三个组作为替换(你没有说你使用的是哪种语言,所以我不能举个例子)

    第一组匹配一个最终的标题,后跟一个空格并捕获它。 第二组匹配第一个单词的第一个字母,第三组捕获最后一个单词(姓氏)。第二组和第三组之间的字符匹配以匹配名称格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      相关资源
      最近更新 更多