将全名分成名字和姓氏是一个无法解决的问题,因为名字真的非常复杂。因此,我的模型代表了一本书的作者和其他贡献者,包括name
和filingName
字段,其中filingName
通常应该是“Last, First”(用于西方名称)。
但是,为了方便我的用户,我想让我的应用程序在用户填写常规名称时对归档名称做出合理的猜测。当然,如果猜错了,用户可以编辑文件名,但如果我猜对了,我会为他们节省一些时间。目前我只是假设最后一个以空格分隔的“单词”是姓氏,并用逗号将其移到前面:
NSMutableArray * parts = [self.name componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceCharacterSet].mutableCopy;
if(parts.count < 2) {
return self.name;
}
NSString * lastName = parts.lastObject;
[parts removeLastObject];
return [NSString stringWithFormat:@"%@, %@", lastName, [parts componentsJoinedByString:@" "]];
我可以立即想到一种情况,这会让我误入歧途:像“Jr”这样的后缀。但我敢肯定还有很多其他人。是否有任何好的资源来解释常见的命名注意事项,或者解决这个问题的代码的好例子,我可以用来改进我的启发式方法?我在 Mac 上使用 Objective-C(以防框架的某个晦涩的角落可以帮助我),但我愿意从用任何语言编写的代码中学习。
此类问题之前已被 问 过,但大多数答案要么集中在拆分字符串的机制上,要么转向“以不同方式设计模型”。我正在以不同的方式设计我的模型;我只是想让计算机为他们完成大部分用户的工作。
正如我之前所说,这段代码主要处理书籍的作者和其他贡献者的姓名。其中的一些具体后果包括:
- 中应该只有一个名字
name
,因为我支持将多个作者附加到一本书。 - 大多数名字不会有头衔,而是像“博士”这样的专业头衔。可以出现。理想情况下,这些将被丢弃,而不是作为名字的一部分。
- 这些名字通常是人的,但有时可能是组织的。我完全愿意冒险修改组织名称以获得更好的人名处理。
- 我预计我将主要处理欧洲名称,尽管检测名称的拼写应该不难。
- 代码不应该对用户的语言环境特别敏感。