在Swift

时间:2019-02-08 18:02:25

标签: swift regex

我需要在Swift中运行一个相对复杂的正则表达式。最初是:

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

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

要使其在Swift中编译,我将反斜杠转义为:

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

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

1 个答案:

答案 0 :(得分: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"]