我有很多人名。它们都是“西方”的名字,我只需要美国的惯例/缩写(例如,先生而不是老先生代表西诺)。不幸的是,我寄东西给的人没有输入他们自己的名字,所以我不能问他们想叫什么。我知道每个人的性别和他们的全名,但还没有真正解析出更具体的东西。
一些例子:
约翰史密斯
小约翰·史密斯
小约翰·史密斯。
约翰·史密斯十四世
约翰·史密斯博士
我希望能够解析出每个名字的部分:
name = Name.new("John Smith Jr.")
name.first_name # <= John
name.greeting # <= Mr. Smith
如果我在找“问候”(可能不是最好的称呼),我想要的是1-4“史密斯先生”。5英镑,我想要史密斯医生,但我愿意接受史密斯先生。
用红宝石做这个比较理想。我的灵感来源于chronic,它是一种处理时间的红宝石,以一种非常人性化的方式,让我正确地告诉它“上星期二”,并让它想出一些合理的方法,“一些算法足以解决大多数角落的情况。
我正在努力解决falsehoods programmers believe about names中提出的一些问题。
最佳答案
既然你只知道西方风格的名字,我想有几个规则会让你走到那里:
如果出现逗号,请删除最左边的逗号及其后面的所有内容。
继续从一开始删除单词,在转换为小写并删除任何句号之后,它们属于集合{ mr mrs miss ms rev dr prof }
以及您可以想到的任何更多。使用标题“分数”的表格(例如[mr=1, mrs=1, rev=2, dr=3, prof=4]
——根据需要排序),记录删除的最高分数标题。
当单词属于{ jr phd }
集合或是大约50或更少的罗马数字时,继续从结尾删除它们(/[XVI]+/
可能是一个足够好的正则表达式)。
如果在步骤2中删除了一个或多个得分非零的标题,请使用得分最高的标题。否则,请根据提供的性别使用“先生”或“太太”。
作为姓氏,用最后一个字。
永远不可能保证像“john baxter smith”这样的名字被正确解析,因为并非所有的双筒姓氏都使用连字符。“巴克斯特史密斯”是姓吗?或者“巴克斯特”是中间名?我认为可以肯定的是,中间名相对来说比双筒但不带字母的姓氏更常见,这意味着最好默认将最后一个单词报告为姓氏。不过,您可能还需要编译一个常见的双筒姓氏列表,并对此进行检查。