如何在字符串中最后一次出现字符后获取子字符串:Swift IOS

时间:2016-04-28 04:32:24

标签: string swift

基本上,我想创建一个程序,如果你开始输入一个名字,应用程序将从数据库中识别它并为你填写名称。要执行此操作,如果某人在完成名称后键入逗号,则应用程序将开始记录下一个名称。如果它作为数据库中某个名称的子字符串匹配,则会将其填入用户。问题是我需要在textField字符串中最后一次出现逗号字符后到目前为止填写名称的哪一部分,但我不知道如何填写。例如: 用户类型:“Daniel,Joh” 该应用程序为你填写约翰。感谢。

3 个答案:

答案 0 :(得分:2)

如果您真的想要最后一个逗号后的字符,可以使用正则表达式:

let string = "Hamilton, A"
let regex = try! NSRegularExpression(pattern: ",\\s*(\\S[^,]*)$")
if let match = regex.firstMatch(in: string, range: string.nsRange), let result = string[match.range(at: 1)] {
    // use `result` here
}

在Swift 4中的位置:

extension String {

    /// An `NSRange` that represents the full range of the string.

    var nsRange: NSRange {
        return NSRange(startIndex ..< endIndex, in: self)
    }

    /// Substring from `NSRange`
    ///
    /// - Parameter nsRange: `NSRange` within the string.
    /// - Returns: `Substring` with the given `NSRange`, or `nil` if the range can't be converted.

    subscript(nsRange: NSRange) -> Substring? {
        return Range(nsRange, in: self)
            .flatMap { self[$0] }
    }
}

答案 1 :(得分:2)

非常感谢Rob。我们甚至可以扩展他的String扩展名,包括对任何问题的完整回答,包括任何字符:

extension String {

func substringAfterLastOccurenceOf(_ char: Character) -> String {

    let regex = try! NSRegularExpression(pattern: "\(char)\\s*(\\S[^\(char)]*)$")
    if let match = regex.firstMatch(in: self, range: self.nsRange), let result = self[match.range(at: 1)] {
        return String(result)
    }
    return ""
}

// ... Rob's String extension 

}

所以我们只需要打电话:

let subStringAfterLastComma = "Hamilton, A".substringAfterLastOccurenceOf(",")

答案 2 :(得分:0)

带有range(of和选项regularExpressionbackwards的简单解决方案。

它将搜索逗号,后跟一个可选的空白字符。

extension String {
    var subStringAfterLastComma : String {
        guard let subrange = self.range(of: ",\\s?", options: [.regularExpression, .backwards]) else { return self }
        return String(self[subrange.upperBound...])
    }
}

let string1 = "Dan".subStringAfterLastComma // "Dan"
let string2 = "Daniel, Joh".subStringAfterLastComma // "Joh"