Swift:获取String中单词的开头和结尾字符的索引
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift:获取String中单词的开头和结尾字符的索引相关的知识,希望对你有一定的参考价值。
字符串:
"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
s与其原始字符串共享一个公共索引。)
另一种方法是使用“数据检测器”,以便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])
}
}
不同的方法:
你有字符串和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] }
一种方法可能是将原始字符串拆分为“,”然后使用简单的数学运算来查找给定位置(39)存在于数组的哪个元素,并从那里获得前一个空格和下一个逗号的正确字符串或索引取决于您的最终目标。
以上是关于Swift:获取String中单词的开头和结尾字符的索引的主要内容,如果未能解决你的问题,请参考以下文章
10 位或 6 位数字的正则表达式不应以“/”开头和结尾,也可以是字符串中的单个单词 [重复]