Вам нужно экранировать {
и }
, которые находятся вне класса персонажей:
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
Когда {
и }
находятся внутри класса символов, они могут остаться без экранирования (как в [^}]
).
Используя этот код (ответ 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"]