在Swift 3中更新一个范围

4

我正在尝试使用以下代码片段(它是 String 的扩展)搜索包含 regex 的字符串:

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?
    }
}

它将正确找到第一个匹配,但我不知道如何更改范围以便从匹配位置开始搜索其余字符串。

1
你在那个 while 循环里面想做什么?即使你可以更新范围,似乎也是一个无限循环。我认为使用 NSRegularExpression 更加简洁。 - Code Different
听取您的建议,有什么方法可以让这个循环正常工作吗?我也会查看 NSRegularExpression - koen
@MartinR:我最终使用了NSRegularExpression - koen
1个回答

6

lowerBoundupperBound是一个范围的不可变属性, 因此你需要创建一个新的范围,从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
}

如果空字符串匹配模式(例如 regex = "^"),仍然可能导致无限循环。这可以得到解决,但是作为替代方案,可以使用 NSRegularExpression 获取所有匹配项列表(例如,请参见Swift extract regex matches)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接