在Swift 3中更新一个范围

koe*_*oen 4 string range swift swift3

我想搜索Stringregex使用下面的代码片段(它在一个扩展String):

var range = self.startIndex..<self.endIndex

while range.lowerBound < range.upperBound {
    if let match = self.range(of: regex, options: .regularExpression, range: range, locale: nil) {

        print(match)
        range = ????? <============  this line, how do I update the range?
    }
}
Run Code Online (Sandbox Code Playgroud)

它将正确地找到第一次出现,但后来我不知道如何将范围更改为匹配位置以搜索字符串的其余部分.

Mar*_*n R 5

lowerBound并且upperBound是范围的不可变属性,因此您必须创建一个新范围,从match.upperBound.

如果没有找到匹配,循环也应该终止.这可以通过将绑定移动let match = ...到where条件来实现 .

var range = self.startIndex..<self.endIndex
while range.lowerBound < range.upperBound,
    let match = self.range(of: regex, options: .regularExpression, range: range) {
        print(match) // the matching range
        print(self.substring(with: match)) // the matched string

        range = match.upperBound..<self.endIndex
}
Run Code Online (Sandbox Code Playgroud)

如果空字符串与模式匹配,这仍然会导致无限循环(例如for regex = "^").这可以解决,但作为替代,用于NSRegularExpression获取所有匹配的列表(参见例如Swift提取正则表达式匹配).