字符串:
"jim@domain.com, bill@domain.com, chad@domain.com, tom@domain.com"
通过手势识别器,我能够获得用户点击的字符(很高兴提供代码,但此时看不到相关性)。

假设用户点击了o中的"chad@domain.com",字符index39
给定39indexo,我想获得c的开始的"chad@domain.com"的字符串起始索引,以及index结束的m"com"的结束"chad@domain.com"

换句话说,给定indexcharacterString,我需要先获得indexleft上的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])
    }
}

10-07 19:54
查看更多