Swift:获取String中单词的开头和结尾字符的索引

时间:2018-03-28 18:26:53

标签: ios swift xcode nsstring

字符串:

"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

我不确定从哪里开始?

3 个答案:

答案 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)存在于数组的哪个元素,并从那里获得前一个空格的正确字符串或索引和下一个逗号取决于你的最终目标。