字符串:"jim@domain.com, bill@domain.com, chad@domain.com, tom@domain.com"
通过手势识别器,我能够获得用户点击的字符(很高兴提供代码,但此时看不到相关性)。
假设用户点击了o
中的"chad@domain.com"
,字符index
是39
给定39
的index
的o
,我想获得c
的开始的"chad@domain.com"
的字符串起始索引,以及index
结束的m
的"com"
的结束"chad@domain.com"
。
换句话说,给定index
中character
的String
,我需要先获得index
和left
上的right
,然后再在左边的String
和右边的comma
中遇到一个空格。
尝试过,但这仅提供了字符串中的最后一个单词:
if let range = text.range(of: " ", options: .backwards) {
let suffix = String(text.suffix(from: range.upperBound))
print(suffix) // tom@domain.com
}
我不确定从这里去哪里?
最佳答案
您可以在给定字符串的两个片段上调用range(of:)
:text[..<index]
是给定字符位置之前的文本,text[index...]
是从给定位置开始的文本。
例:
let text = "jim@domain.com, bill@domain.com, chad@domain.com, tom@domain.com"
let index = text.index(text.startIndex, offsetBy: 39)
// Search the space before the given position:
let start = text[..<index].range(of: " ", options: .backwards)?.upperBound ?? text.startIndex
// Search the comma after the given position:
let end = text[index...].range(of: ",")?.lowerBound ?? text.endIndex
print(text[start..<end]) // chad@domain.com
如果没有空格(或逗号),则两个
range(of:)
调用均返回nil
被发现。在这种情况下,将使用nil-coalescing运算符??
而是获取开始(或结束)索引。(请注意,这是可行的,因为
Substring
共享一个 public 索引及其原始字符串。)
一种替代方法是使用“数据检测器”,
因此,URL检测不依赖于某些分隔符。
示例(比较How to detect a URL in a String using NSDataDetector):
let text = "jim@domain.com, bill@domain.com, chad@domain.com, tom@domain.com"
let index = text.index(text.startIndex, offsetBy: 39)
let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
let matches = detector.matches(in: text, range: NSRange(location: 0, length: text.utf16.count))
for match in matches {
if let range = Range(match.range, in: text), range.contains(index) {
print(text[range])
}
}