基本上,我想做一个程序,当你开始输入一个名字时,应用程序将从数据库中识别它并为你填写该名称。为了做到这一点,如果一个人在完成一个姓名后输入逗号,应用程序将开始记录下一个姓名是什么。如果它匹配数据库中的某个名称的子字符串,它将为用户填写。问题是我需要得到自上次textField字符串中逗号字符之后填充的名称部分,但我不知道如何获取。例如:
用户输入:"Daniel, Joh"
然后应用程序为您填写John。谢谢。
如果你确实想要在最后一个逗号之后的字符,你可以使用正则表达式:
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] }
}
}
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 Spiesbergerextension 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(",")
使用range(of
和选项regularExpression
和backwards
的简单解决方案。
它搜索逗号后跟一个可选的空格字符。
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"
$
,它表示“匹配字符串的结尾”。因此,你只会得到一个匹配项,即在结尾处(如果有的话)。我之所以使用firstMatchInString
,是因为既然我们只获取最后一个匹配项,就没有必要枚举所有匹配项,而是直接获取字符串末尾的“第一个”匹配项。 - Rob