只查找String中子字符串的完全匹配

  • 本文关键字:字符串 查找 String swift
  • 更新时间 :
  • 英文 :


假设我有一个字符串"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)

如果运行两次,则得到两个匹配项

最新更新