字符串:
"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"
开始,结束{{ 1}}来自index
的{{1}},其中m
结束。
换句话说,如果"com"
中的"chad@domain.com"
为index
,我需要在character
和{{1}上获得String
在我们遇到左侧index
和右侧left
的空格之前。
尝试过,但这只提供字符串中的最后一个字:
right
我不确定从哪里开始?
答案 0 :(得分:3)
您可以在给定字符串的两个切片上调用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
共享一个公共索引
用他们的原始字符串。)
另一种方法是使用&#34;数据检测器&#34;, 这样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])
}
}
答案 1 :(得分:2)
不同的方法:
您有字符串和Int
索引
let string = "jim@domain.com, bill@domain.com, chad@domain.com, tom@domain.com"
let characterIndex = 39
从String.Index
Int
let stringIndex = string.index(string.startIndex, offsetBy: characterIndex)
将字符串转换为地址数组
let addresses = string.components(separatedBy: ", ")
将地址映射到字符串
中的范围(Range<String.Index>
)
let ranges = addresses.map{string.range(of: $0)!}
获取包含Int
stringIndex
)索引
if let index = ranges.index(where: {$0.contains(stringIndex)}) {
获取相应的地址
let address = addresses[index] }
答案 2 :(得分:0)
一种方法可能是将原始字符串拆分为“,”然后使用简单的数学运算来查找给定位置(39)存在于数组的哪个元素,并从那里获得前一个空格的正确字符串或索引和下一个逗号取决于你的最终目标。