假设我有一个字符串"45分钟。5分钟",我想找到"5分钟"的范围
let example = "45 minutes. 5 minutes"
let range = example.range(of: "5 minutes")
不返回与独立的"5分钟"匹配的范围,而是与"45"的末尾匹配。
let example = "45 minutes. 5 minutes"
|–––––––| // ← This is the match
|–––––––| // ← This is what I am after
那么我怎么才能找到这个字符串第二次出现的范围呢
您可以搜索backwards
let example = "45 minutes. 5 minutes"
let range = example.range(of: "5 minutes", options: .backwards)
或者在正则表达式的帮助下,如果第二次出现正好是字符串
的末尾let range = example.range(of: "5 minutes$", options: .regularExpression)
或如果不是字符串
的结尾,则使用字边界说明符。let range = example.range(of: "\b5 minutes", options: .regularExpression)
编辑:
由于您显然正在寻找所有匹配的范围-您没有在问题中提到-您可以使用real正则表达式
来完成此操作let example = "45 minutes. 5 minutes"
let regex = try! NSRegularExpression(pattern: "5 minutes")
let matches = regex.matches(in: example, range: NSRange(example.startIndex..., in: example))
.compactMap{Range($0.range, in: example)}
明白了!
当我在数组中找到匹配项时,我存储它们,
let previousMatches = [Range<String.Index>]()
然后当我搜索新的匹配时,我这样做:
var myString = "45 minutes. 5 minutes"
var searchString = "5 minutes"
var searchRange: Range<String.Index>?
if let previousMatch = self.previousMatches.last {
searchRange = previousMatch.upperBound ..< myString.endIndex
}
let match = myString.range(of: "5 minutes", range: searchRange)
如果运行两次,则得到两个匹配项