Swift 匹配正则表达式的字符串扩展名

Swift 匹配正则表达式的字符串扩展名,swift,swift2,swift4,nsregularexpression,swift4.2,Swift,Swift2,Swift4,Nsregularexpression,Swift4.2,我有两个用Swift 2编写的函数,但苹果强迫我迁移到Swift 4,我无法修复这些函数 extension String { func stringsMatchingRegularExpression(expression: String) -> [String] { if let range = self.rangeOfString(expression, options: NSString.CompareOptions.RegularExpressionSea

我有两个用Swift 2编写的函数,但苹果强迫我迁移到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
    }
}
扩展字符串{
func stringsMatchingRegularExpression(表达式:String)->[String]{
如果let range=self.rangeOfString(表达式,选项:NSString.CompareOptions.RegularExpressionSearch,范围:nil,区域设置:nil){
返回[self[range]]+self[range.endIndex..[String]{
变量结果=[String]()
var currentRange=self.characters.index
而让range=self.rangeOfString(表达式,选项:NSString.CompareOptions.RegularExpressionSearch,范围:currentRange,区域设置:nil){
result.append(self[range])
currentRange.startIndex=range.endIndex
}
返回结果
}
}
第一个函数的返回是我无法解决的问题。 在Swift 4中,如果let range=self.range(of:expression,options:NSString.CompareOptions.regularExpression,range:nil,locale:nil),则第三行是
{


在第二个函数中,我不知道如何迁移字符。

.characters
已消失。您可以直接使用字符串本身

self.characters.index
更改为
self.index

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

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

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