在 Swift 中使用特殊字符转义正则表达式

Posted

技术标签:

【中文标题】在 Swift 中使用特殊字符转义正则表达式【英文标题】:Escaping Regex with special characters in Swift 【发布时间】:2019-02-08 18:02:25 【问题描述】:

我有一个相对复杂的正则表达式,需要在 Swift 中运行。原来是:

"typedef\W+struct\W+([^]*)\W+(\w+);"

您可以在 JS here 中看到该模式。

为了让它在 Swift 中编译,我将反斜杠转义为:

"typedef\\W+struct\\W+([^]*)\\W+(\\w+);"

在运行时,表达式编译失败,出现2048 错误。我也尝试转义其他字符并尝试escapedPatternForString,但没有运气。是否有将 JS 正则表达式转换为 Swift 的脚本?谢谢!

【问题讨论】:

我觉得你需要"typedef\\W+struct\\W+\\([^]*)\\\\W+(\\w+);" 你是对的,只转义“”和“”更多,不会失败! 请注意,escapedPatternForString 在您需要将文字字符串传递到正则表达式模式时非常有用。它不应该用于 regex 模式本身。 是的,我是它逃脱了每个特殊字符。谢谢。 【参考方案1】:

您需要同时转义字符类外部

let rx = "typedef\\W+struct\\W+\\([^]*)\\\\W+(\\w+);"

快速演示:

let rx = "typedef\\W+struct\\W+\\([^]*)\\\\W+(\\w+);"
let str = "typedef: struct  something  text;"
print(str.range(of: rx, options: .regularExpression) != nil) 
// => true

在字符类中时,它们可能会保持未转义(如[^])。

使用this code(Confused Vorlon 回答),您可以获得所有捕获组的第一个匹配项:

extension NSTextCheckingResult 
    func groups(testedString:String) -> [String] 
        var groups = [String]()
        for i in  0 ..< self.numberOfRanges
        
            let group = String(testedString[Range(self.range(at: i), in: testedString)!])
            groups.append(group)
        
        return groups
    


let str = "typedef: struct  something  text;"
let rx = "typedef\\W+struct\\W+\\([^]*)\\\\W+(\\w+);"
let MyRegex = try! NSRegularExpression(pattern: rx)
if let match = MyRegex.firstMatch(in: str, range: NSMakeRange(0, str.count)) 
     let groups = match.groups(testedString: str)
     print(groups)

// => ["typedef: struct  something  text;", " something ", "text"]

【讨论】:

@Nuthinking 有很多关于从匹配中获取捕获的问题。例如,请参阅this answer。是否只需要获取单个捕获组的内容?

以上是关于在 Swift 中使用特殊字符转义正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式中必须转义哪些特殊字符?

正则表达式中必须转义哪些特殊字符?

正则表达式仅匹配未转义的特殊字符

Perl:转义字符串中的特殊字符以匹配正则表达式

python 正则表达式之转义字符

正则表达式——转义