【问题标题】:Regex capture group swift正则表达式捕获组 swift
【发布时间】:2015-10-22 21:19:36
【问题描述】:

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

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() 函数解决了。如何快速使用捕获组。请举个例子。

【问题讨论】:

    标签: ios regex swift swift2


    【解决方案1】:

    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)
                }
            }
    

    【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 2018-09-08
    相关资源
    最近更新 更多