NSRegularExpression cannot find capturing group matches
我正在尝试使用一种正则表达式模式解析字符串。
这是模式:
1 | (")(.+)(")\\s*(\\{) |
这里是要解析的文本:
1 | "base" { |
我想找到这 4 个捕获组:
1 2 3 4 | 1." 2. base 3." 4. { |
我正在使用以下代码尝试捕获这些组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class func matchesInCapturingGroups(text: String, pattern: String) -> [String] { var results = [String]() let textRange = NSMakeRange(0, count(text)) var index = 0 if let matches = regexp(pattern)?.matchesInString(text, options: NSMatchingOptions.ReportCompletion, range: textRange) as? [NSTextCheckingResult] { for match in matches { // this match = <NSExtendedRegularExpressionCheckingResult: 0x7fac3b601fd0>{0, 8}{<NSRegularExpression: 0x7fac3b70b5b0> (")(.+)(")\\s*(\\{) 0x1} results.append(self.substring(text, range: match.range)) } } return results } |
不幸的是,它只能找到一个范围
甚至可以使用
是的,当然有可能。您只需要更改当前的逻辑即可查找实际组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | func matchesInCapturingGroups(text: String, pattern: String) -> [String] { var results = [String]() let textRange = NSMakeRange(0, text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) do { let regex = try NSRegularExpression(pattern: pattern, options: []) let matches = regex.matchesInString(text, options: NSMatchingOptions.ReportCompletion, range: textRange) for index in 1..<matches[0].numberOfRanges { results.append((text as NSString).substringWithRange(matches[0].rangeAtIndex(index))) } return results } catch { return [] } } let pattern ="(")(.+)(")\\\\s*(\\\\{)" print(matchesInCapturingGroups(""base" {", pattern: pattern)) |
实际上您只能获得 1 场比赛。你必须进入那场比赛,然后在那里你会找到被捕获的组。请注意,我省略了第一组,因为第一组代表整个比赛。
这将输出
[""","base",""","{"]
注意转义的正则表达式字符串并确保您使用相同的字符串。