2012-11-11 25 views
7

(他の)正規表現文字列に名前付きキャプチャグループを見つけるための正規表現を探しています。Goプログラム言語で名前付きのキャプチャグループを見つける正規表現

例:私は、次の正規表現で(?P<country>m((a|b).+)n)(?P<city>.+)(?P<street>(5|6)\. .+)を見つけたい:

/(?P<country>m((a|b).+)n)/(?P<city>.+)/(?P<street>(5|6)\. .+) 

私は名前のキャプチャグループを検索するには、次の正規表現を試してみました:

var subGroups string = `(\(.+\))*?` 
var prefixedSubGroups string = `.+` + subGroups 
var postfixedSubGroups string = subGroups + `.+` 
var surroundedSubGroups string = `.+` + subGroups + `.+` 
var capturingGroupNameRegex *regexp.RichRegexp = regexp.MustCompile(
    `(?U)` + 
    `\(\?P<.+>` + 
    `(` + prefixedSubGroups + `|` + postfixedSubGroups + `|` + surroundedSubGroups + `)` + 
    `\)`) 

?Uは貪欲な数量を作ります(+および*)非貪欲で非貪欲の量指定子(*?)は貪欲です。 Go regex documentationの詳細

ただし、かっこが正しく一致していないために機能しません。

答えて

6

任意の(再帰的な)ネストを通常の言語で記述することができないため、任意のネストされたカッコを正規表現で正しく一致させることはできません。 (Perlの(?R)構築物はRE2 library that Go's regex package appears to be based onでサポートされていないthe docs explicitly say

いくつかの近代的な正規表現の風味がサポート再帰(Perlの、PCRE)またはバランスのマッチング(.NET)を行うが、Goはそのうちの一つではありません。正規表現ではなく、再帰的降下構文解析プログラムを構築する必要があります。

+2

明確にする:Go正規表現パッケージは、RE2ライブラリを使用していません。 – zzzz

+1

リンクをたどるだけです – mvp

+0

OK、実際にはそのライブラリを使用しませんが、同じ構文を受け入れます。 –

関連する問題