【问题标题】:NSRegularExpression cannot find capturing group matchesNSRegularExpression 找不到捕获组匹配
【发布时间】:2015-10-08 13:20:35
【问题描述】:

我正在尝试使用一种正则表达式模式解析字符串。

这是模式:

(\")(.+)(\")\s*(\{)

这里是要解析的文本:

"base" {

我想找到这 4 个捕获组:

1. "
2. base
3. "
4. {

我正在使用以下代码尝试捕获这些组

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
}

不幸的是,它只能找到一个范围为(0, 8) 的组,它等于:"base" {。所以它会找到一组是整个字符串而不是 4 组。

是否有可能使用NSRegularExpression 获得这些组?

【问题讨论】:

  • @stribizhev 你也必须将\s 转义为\\s
  • 我自己没有做过,但是从 NSTextCheckingResult 的文档中我不得不问:你试过检查match.numberOfRangesmatch.rangeAtIndex吗?
  • @luk2302,是的,我知道,我在玩表达式时从 regex101.com 复制粘贴它,所以它没有被转义。
  • @Sascha Kolberg - 是的,我试过了。结果是一样的。
  • @TomaszSzulc 我写了一个有效的答案......你可能想看看那个。

标签: ios regex swift nsregularexpression capturing-group


【解决方案1】:

是的,当然有可能。您只需更改当前查找实际组的逻辑:

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 场比赛。你必须参加那场比赛,在那里你会找到被俘的小组。请注意,我省略了第一组,因为第一组代表整个比赛。

这将输出

[""", "基础", """, "{"]

注意转义的正则表达式字符串并确保您使用的是相同的。

【讨论】:

  • 谢谢。好的,我想我应该得到多个匹配,但是有一个匹配具有多个范围。现在很清楚了。
  • for index in 1..
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 2011-10-12
  • 2011-06-12
  • 1970-01-01
  • 2013-11-09
相关资源
最近更新 更多