6

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

例: I want to find (?P<country>m((a|b).+)n), (?P<city>.+)and (?P<street>(5|6)\. .+)in the following regex:

/(?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 正規表現のドキュメントを参照してください。

しかし、括弧が正しく一致していないため、機能しません。

4

1 に答える 1

7

任意にネストされた括弧を正規表現で正しく照合することはできません。これは、任意の (再帰的な) ネストを正規言語で記述できないためです。

一部の最新の正規表現フレーバーは、再帰 (Perl、PCRE) またはバランスの取れたマッチング (.NET) をサポートしていますが、Go はそれらの 1 つではありません (ドキュメントでは、Perl の構造は、Go の正規表現パッケージがベースになっているように見える RE2 ライブラリで(?R)はサポートされていないと明示的に述べています。オン)。正規表現ではなく、再帰降下パーサーを作成する必要があります。

于 2012-11-11T10:25:54.973 に答える