我需要在Swift中运行一个相对复杂的正则表达式。最初是:
"typedef\W+struct\W+{([^}]*)}\W+(\w+);"
您可以看到该模式在JS here中起作用。
要使其在Swift中编译,我将反斜杠转义为:
"typedef\\W+struct\\W+{([^}]*)}\\W+(\\w+);"
在运行时,表达式无法编译,并显示2048
错误。我也尝试过转义其他字符,也尝试过escapedPatternForString
但没有运气。是否有将JS正则表达式转换为Swift的脚本?谢谢!
答案 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"]