正则表达式捕获组Swift

4

我有一个字符串中的正则表达式搜索方法:

extension String {
    func searchRegex (regex: String) -> Array<String> {
        do {
            let regex = try NSRegularExpression(pattern: regex, options: NSRegularExpressionOptions(rawValue: 0))
            let nsstr = self as NSString
            let all = NSRange(location: 0, length: nsstr.length)
            var matches : Array<String> = Array<String>()
            regex.enumerateMatchesInString(self, options: NSMatchingOptions(rawValue: 0), range: all) {
                (result : NSTextCheckingResult?, _, _) in
                let theResult = nsstr.substringWithRange(result!.range)
                matches.append(theResult)
            }
            return matches
        } catch {
            return Array<String>()
        }
    }
}

它运作良好。但是,如果我有一个正则表达式product_title:\['(.*)'它会返回product_title:[\'Some title bla bla\',但我只需要部分内容(.*)

我是新手Swift,但在Python中,可以使用groups()函数来解决此问题。如何在Swift中使用捕获组,请给我一个示例。

1个回答

9

NSTextCheckingResult有一个numberOfRanges属性和一个rangeAtIndex()方法,它允许您获取单个捕获组的范围。因此,如果您想要第一个捕获组而不是整个匹配的字符串,您需要修改您的代码如下:

        var matches : Array<String> = Array<String>()
        regex.enumerateMatchesInString(self, options: NSMatchingOptions(rawValue: 0), range: all) {(result : NSTextCheckingResult?, _, _) in
            let capturedRange = result!.rangeAtIndex(1)
            if !NSEqualRanges(capturedRange, NSMakeRange(NSNotFound, 0)) {
                let theResult = nsstr.substringWithRange(result!.rangeAtIndex(1))
                matches.append(theResult)
            }
        }

当我在使用这个正则表达式超过一个捕获组时,我遇到了一个NSRangeException异常。 - Declan McKenna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接