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

Posted

技术标签:

【中文标题】匹配正则表达式的字符串扩展【英文标题】:String extension for matching regular expression 【发布时间】:2019-11-05 04:07:51 【问题描述】:

我有 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
    

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

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

【问题讨论】:

可能有帮助:***.com/questions/27880650/… 【参考方案1】:

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

self.characters.indices 更改为self.indices

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

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

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

【讨论】:

大表情呢? 我相信这两者都可以处理。 我添加了一些更方便的代码。喜欢就去看看吧。

以上是关于匹配正则表达式的字符串扩展的主要内容,如果未能解决你的问题,请参考以下文章

Shell 学习:正则表达式

Shell 学习:正则表达式

Shell 学习:正则表达式

Linux正则表达式——扩展篇

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

5.2.1 正则表达式语法与子模式扩展语法