用于匹配正则表达式的字符串扩展

String extension for matching regular expression

提问人:Bogdan Bogdanov 提问时间:6/23/2019 最后编辑:Mojtaba HosseiniBogdan Bogdanov 更新时间:6/24/2019 访问量:774

问:

我有 2 个用 Swift 2 编写的函数,但 Apple 强迫我迁移到 Swift 4,我无法修复这些函数。

extension String {
    func stringsMatchingRegularExpression(expression: String) -> [String] {
        if let range = self.rangeOfString(expression, options: NSString.CompareOptions.RegularExpressionSearch, range: nil, locale: nil) {
            return [self[range]] + self[range.endIndex..<self.endIndex].stringsMatchingRegularExpression(expression)
        }
        return []
    }

    func stringsMatchingRegularExpressionLarge(expression: String) -> [String] {
        var result = [String]()
        var currentRange = self.characters.indices
        while let range = self.rangeOfString(expression, options: NSString.CompareOptions.RegularExpressionSearch, range: currentRange, locale: nil) {
            result.append(self[range])
            currentRange.startIndex = range.endIndex
        }
        return result
    }
}

第一个函数的返回是我无法解决的问题。 第三行在 Swift 4 中if let range = self.range(of: expression, options: NSString.CompareOptions.regularExpression, range: nil, locale: nil){

在第二个函数中,我不知道 .characters 是如何迁移的。

swift swift2 ns正则表达式 swift4.2

评论

0赞 Martin R 6/23/2019
可能有帮助:stackoverflow.com/questions/27880650/......

答:

3赞 Mojtaba Hosseini 6/23/2019 #1

.characters都不见了。您可以直接使用字符串本身。

更改为self.characters.indicesself.indices

更改为self.rangeOfString(expression, options: NSString.CompareOptions.RegularExpressionSearch, range: nil, locale: nil)self.range(of: expression, options: .regularExpression, range: nil, locale: nil)

最后,您可以使用而不是递归调用该函数,但请注意,它可能会出现一些错误,因此您应该以某种方式处理它。使用此扩展:NSRegularExpressionthrow

extension String {
    func stringsMatchingRegularExpression(expression regex: String) throws -> [String] {
        let regex = try NSRegularExpression(pattern: regex)
        let results = regex.matches(in: self,
                                    range: NSRange(self.startIndex..., in: self))
        return results.map {
            String(self[Range($0.range, in: self)!])
        }
    }
}

- 更迅捷的风格:

extension String {

    func matching(expression regex: @autoclosure () throws -> NSRegularExpression) rethrows -> [String] {
        let results = try regex().matches(in: self, range: NSRange(self.startIndex..., in: self))
        return results.map {
            String(self[Range($0.range, in: self)!])
        }
    }

    func matching(pattern regexPattern: String) throws -> [String] {
        return try self.matching(expression: NSRegularExpression(pattern: regexPattern))
    }
}

评论

0赞 Bogdan Bogdanov 6/23/2019
大表情呢?
0赞 Mojtaba Hosseini 6/23/2019
我相信这可以同时处理两者。
2赞 Mojtaba Hosseini 6/23/2019
我添加了一些更方便的代码。如果你愿意,可以看看。