我想获得字符串中子字符串的开始和结束位置。示例:在字符串“嗨,这是我的名字”;如果我提供字符串“this”,我想知道起始索引是4,结束索引是7。
我找到了几个链接,包括这个链接:
Swift: get index of start of a substring in a string 一个子串-IN-A-串
但它在swift 3中不起作用,因为该方法现在称为范围。
我现在正在使用它:
let range = mystring.range(of: "StringSearch")?.lowerBound
返回此
Swift.String.UnicodeScalarView.Index(_position: 15), _countUTF16: 1))
我无法获得整数的位置,因为这是一个索引。
总之,我想在一个int类型的变量中使用位置,在本例中为15。
任何人都可以帮助我吗?
谢谢大家。
答案 0 :(得分:20)
String
的{{3}}方法计算差异
在两个String.Index
值之间:
let mystring = "hi this is my name"
if let range = mystring.range(of: "this") {
let startPos = mystring.distance(from: mystring.startIndex, to: range.lowerBound)
let endPos = mystring.distance(from: mystring.startIndex, to: range.upperBound)
print(startPos, endPos) // 3 7
}
实际上它只是将调用转发给字符串' CharacterView
,所以
以上结果与
let mystring = "hi this is my name"
if let range = mystring.range(of: "this") {
let startPos = mystring.characters.distance(from: mystring.characters.startIndex, to: range.lowerBound)
let endPos = mystring.characters.distance(from: mystring.characters.startIndex, to: range.upperBound)
print(startPos, endPos) // 3 7
}
如果您需要所有出现的字符串:
let mystring = "this is this and that is that"
var searchPosition = mystring.startIndex
while let range = mystring.range(of: "this", range: searchPosition..<mystring.endIndex) {
let startPos = mystring.distance(from: mystring.startIndex, to: range.lowerBound)
let endPos = mystring.distance(from: mystring.startIndex, to: range.upperBound)
print(startPos, endPos)
searchPosition = range.upperBound
}
答案 1 :(得分:1)
将Martin R的答案改编成函数,第一次出现NSRange
。您也可以将其转换为extension
String
。
public class func indexOf(string: String, substring: String) -> NSRange? {
if let range = string.range(of: substring) {
let startPos = string.distance(from: string.startIndex, to: range.lowerBound)
return NSMakeRange(startPos, substring.count)
}
}