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

5
基本上,我想做一个程序,当你开始输入一个名字时,应用程序将从数据库中识别它并为你填写该名称。为了做到这一点,如果一个人在完成一个姓名后输入逗号,应用程序将开始记录下一个姓名是什么。如果它匹配数据库中的某个名称的子字符串,它将为用户填写。问题是我需要得到自上次textField字符串中逗号字符之后填充的名称部分,但我不知道如何获取。例如: 用户输入:"Daniel, Joh" 然后应用程序为您填写John。谢谢。
4个回答

4

如果你确实想要在最后一个逗号之后的字符,你可以使用正则表达式:

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] }
    }
}

如果名单上有超过2个名字,正则表达式的解决方案是否仍然有效? - dhruvm
抱歉,我只是问一下,因为它说的是firstMatchInString而不是last。谢谢。 - dhruvm
好的,我理解你的困惑。但是如果你看一下我的正则表达式字符串,最后一个字符是 $,它表示“匹配字符串的结尾”。因此,你只会得到一个匹配项,即在结尾处(如果有的话)。我之所以使用 firstMatchInString,是因为既然我们只获取最后一个匹配项,就没有必要枚举所有匹配项,而是直接获取字符串末尾的“第一个”匹配项。 - Rob

3
感谢Rob的贡献。我们可以通过包含任何字符的完整答案来扩展他的字符串扩展功能。
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(",")

不再起作用:String 类型的值没有成员 nsRange - Paul Spiesberger
1
@PaulSpiesberger 你需要包含Rob的扩展,然后它就可以工作了。 - atultw

1
感谢Rob和Thierry G.
extension String {
    
    var nsRange: NSRange {
        return Foundation.NSRange(startIndex ..< endIndex, in: self)
    }
    
    subscript(nsRange: NSRange) -> Substring? {
        return Range(nsRange, in: self)
            .flatMap { self[$0] }
    }
    
    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 ""
    }
}

我们可以这样使用。
let subStringAfterLastComma = "Hamilton, A".substringAfterLastOccurenceOf(",")

1

使用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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接