【问题标题】:String issues. Format "First Last" to format "Last, First" with a twist字符串问题。将“First Last”格式化为“Last, First”的格式
【发布时间】:2014-09-22 04:16:24
【问题描述】:

我需要将包含“First Last”格式的名称的字符串更改为“Last, First”格式。问题是,字符串可能像“John Smith”,也可能是“Mr. John Smith”,甚至是“Mr. John A. Smith”。我怎样才能消除“先生”?部分和中间名/初始部分,然后将其设为“史密斯,约翰”?顺便说一句,我讨厌字符串...我预见到很多修剪(右),修剪(左)废话...请让它更容易!

我的目标是通过姓氏的第一个字母从数据库字段 NAME 中选择记录。 NAME 字段包含诸如“John Smith”“Mr. Roger A. Smith”“Mr. Jones”等名称。我只需要一个返回 Smith 而不是 Jones 的搜索函数。

【问题讨论】:

  • Uncle Bob 有一个关于 TDD 的截屏视频,专门处理此要求以及如何编写满足它的测试。它涵盖了称呼等。不过,我这辈子都不记得是哪一个了!
  • 如果没有特定的文化知识,可能没有完整的答案 - 例如,如果某人的名字是“Jean-Claude Van Damme”,那么正确的答案可能是“Van Damme, Jean- Claude”(如导演的情况),但如果存在以“Van”作为有效中间名的文化,也可以是“Damme, Jean-Claude”。在某些文化中,姓氏是第一位的,例如中国。没有“规则”。我的一位祖先的姓氏(在相关语言中)几乎与“芒斯小姐”一模一样。
  • 另外,在荷兰语中,像 JCVD's 这样的名字将在电话簿中的字母“D”下被列为“van Damme, Jeann-Claude”(还要注意“van”中的小写“v” ”。另一个常见的前缀是“van der”——如“van der Graaf generator”——有时缩写为“v/d Graaf”
  • 鲍勃叔叔是谁?我猜 Jean-Claude 的问题不会出现太多,因为它是一个美国项目,名字大多是美国人。
  • 该字符串是如何形成的?是用户输入吗?

标签: vb.net string


【解决方案1】:

这是否满足您的要求?

Dim samples As String() = {
    "John Smith",
    "John A. Smith",
    "Mr. John Smith",
    "Mr. John A. Smith",
    "Jean-Claude Van Damme"
}

Dim regex As New Regex("(?:(?:mr\.|miss|mrs|ms)\s+)?(\S+).*(?<=\s)(\S+)$", RegexOptions.IgnoreCase)

For Each sample In samples
    Dim converted As String = regex.Replace(sample, "$2, $1")
    Console.WriteLine("{0} => {1}", sample, converted)
Next

结果:

John Smith => Smith, John
John A. Smith => Smith, John
Mr. John Smith => Smith, John
Mr. John A. Smith => Smith, John
Jean-Claude Van Damme => Damme, Jean-Claude

.Net Fiddle

【讨论】:

  • 如果我可以将其转换为 vb,是的...感谢您编写我不理解的代码....
  • @JimB 这已经是 VB 代码了。由于您正在寻找单线解决方案,我建议使用Regular Expression。是的,它非常不可读且难以理解(但 IMO 仍然值得学习)。您想要另一种可读但非单行的解决方案吗?或者关于正则表达式的一些解释?
  • 抱歉我的第一条评论。我有点醉了,觉得这很有趣——读回来,听起来我是个混蛋。我的道歉 - 语气不能通过打字很好地传达。我正在认真编写我不理解的代码,因为我现在必须学习正则表达式的东西。从来没有任何要求,但我现在这样做。所以,说真的,谢谢。我对代码印象深刻。我将花时间阅读正则表达式并尝试您的解决方案。
  • 刚刚测试了您提供的代码示例。完美的!奇迹般有效!现在,我只需要自己学习如何编写它,这样我就可以使用它了……再次,ty。
猜你喜欢
  • 2017-12-07
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2018-01-26
  • 2011-01-22
  • 1970-01-01
相关资源
最近更新 更多