【问题标题】:How to get substring after last occurrence of character in string: Swift IOS如何在字符串中最后一次出现字符后获取子字符串:Swift IOS
【发布时间】:2016-04-28 04:32:24
【问题描述】:

基本上,我想制作一个程序,如果您开始输入名称,应用程序会从数据库中识别它并为您填写名称。为此,如果一个人在完成一个名字后键入逗号,该应用程序将开始记录下一个名字是什么。如果它作为数据库中名称之一的子字符串匹配,它将为用户填充它。问题是,在 textField 字符串中最后一次出现逗号字符之后,我需要获取名称的哪一部分已填写,但我不知道如何。例如: 用户类型:“Daniel, Joh” 该应用程序会为您填写 John。谢谢。

【问题讨论】:

    标签: string swift


    【解决方案1】:

    非常感谢 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(",")
    

    【讨论】:

    • 不再工作:Value of type 'String' has no member 'nsRange'
    【解决方案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] }
        }
    }
    

    【讨论】:

    • 如果列表中有两个以上的名字,正则表达式解决方案是否也有效?
    • 对不起,我只是问,因为它说 firstMatchInString 不是最后一个。谢谢
    • 好的,我理解这种困惑。但是,如果您查看我的正则表达式字符串,最后一个字符是$,它表示“匹配字符串结尾”。因此,您只会得到一场比赛,最后一场比赛(如果有的话)。我只使用firstMatchInString,因为因为我们只得到最后一个,所以没有必要枚举,而只需抓住字符串末尾的“第一个”匹配项。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 1970-01-01
      • 2014-12-12
      • 2015-05-11
      • 2012-06-05
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 2020-09-17
      相关资源
      最近更新 更多