如何获取名称中的所有中间名

How to get all middle names In a name

说,我有以下全名:

1) 惠特尼·拉贾坎亚·斯里瓦纳·乔文迪

2) 谢丽尔·汤普森·温斯顿

如何从上面各自的全名中检索中间名?

示例:
name(1)中有2个中间名,name(2)中有1个中间名

我使用了这段代码,但没有得到中间名。

var components = fullName.components(separatedBy: " ")
if(components.count > 0)
{
    let firstName = components.removeFirst()
}

问题:

1) 如何获取一个名字中所有的中间名?有些名字有 1 个或多个(如上所示)。

谢谢

如果您将 "middle name" 定义为名称中除第一个和最后一个单词之外的所有内容,那么您可以按空格拆分字符串,dropFirstdropLast,然后加入结果.

var components = fullName.components(separatedBy: " ")

if (components.count <= 2) {
    // no middle name
} else {
    let middleName = components.dropFirst().dropLast().joined(separator: " ")
}

如果名称来自不同的语言环境并且您需要不同的方式来处理它们,您也可以使用 PersonNameComponentsFormatter

您可以定义贪婪的正则表达式并轻松获取中间名,例如:

let namesArray = ["Whitney Rajakanya SiriVana Giovendi", "Cheryl Thompson Winston", "James T. Kirk", "Jean-Luc Picard", "J. Archer"]

if let regExp = try? NSRegularExpression(pattern: " (.*) ", options: .caseInsensitive) {

    namesArray.forEach { (name) in
        regExp.matches(in: name, options: .reportProgress, range: NSRange(location: 0, length: name.count)).forEach({ (textCheckingResult) in
            guard textCheckingResult.numberOfRanges > 1 else { return }
            let middleNames = (name as NSString).substring(with: textCheckingResult.range(at: 1))
            debugPrint("\(middleNames)")
        })
    }
}

然后你可以看到打印出来的中间名,比如:

Rajakanya SiriVana
Thompson
T.

这可能是一个干净利落的解决方案。


注意:逻辑上不清楚是否应该过滤掉缩短的中间名,但你可以得到要点并且能够在您方便的时候扩展这个概念。