5

1 つの正規表現パターンを使用して文字列を解析しようとしています。

パターンは次のとおりです。

(\")(.+)(\")\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
}

残念ながら、次の範囲のグループを 1 つしか見つけることができませ(0, 8)"base" {。そのため、4 つのグループではなく、文字列全体である 1 つのグループが検出されます。

を使用してそれらのグループを取得することさえ可能NSRegularExpressionですか?

4

1 に答える 1

7

はい、もちろん可能です。実際のグループを見つけるために、現在のロジックを変更する必要があります。

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 試合しかありません。その試合に参加する必要があり、そこに捕獲されたグループがあります。最初のグループは試合全体を表すため、最初のグループを省略していることに注意してください。

これは出力されます

["""、 "ベース"、 """、 "{"]

エスケープされた正規表現文字列に注意し、同じものを使用していることを確認してください。

于 2015-07-19T08:43:36.737 に答える