|
でるもんた・いいじまです。
さきほど4番会議室に投稿させていただいたご提案に関して少し実験してみたのです
が、仕様なのかたまたま今の実装がそうなっているだけなのか判断つきかねているの
で、質問させてください。
まず、エディタに
xyxyxyxy
の8文字を入力します。
次に検索ダイアログを開いて、下記の正規表現で検索をかけます。
(?<a>x)(?<a>y)\g<a>\g<a>
そうするとヒットしません。
次に\g<a>を一つ削って
(?<a>x)(?<a>y)\g<a>
とすると、先頭の「xyx」と5文字目からの「xyx」がヒットします。
最終的に
(?<a>x)(?<a>y).\g<a>
としてみると、案の定、ヒットしません。
というわけで、(?<名前>パターン) というパターンは現状、次のような実装になって
いることが分かりますが、これを「正式な仕様」と考えても大丈夫でしょうか?
@同じ「名前」と別々の「パターン」の組み合わせを複数回書いてもエラーにはなら
ず、その場ではすんなり「パターン」にヒットする。今回の例でいえば (?<a>y) は
ちゃんと y にヒットする。
Aところがそういう場合でも、\g<パターン> は最初に定義したときのパターンにマ
ッチする。今回は一番最初に (?<a>x) があるので、そのあと (?<a>…) として何が
来ても \g<a> は x のままであって、後から再定義しても上書きされない。
ちなみに他の実装の例だと、
https://perldoc.jp/docs/perl/5.26.1/perlre.pod
あたりでは「最初の定義が有効」と明言しています。
“数値を全く使わずに、名前付き捕捉グループを作ることが出来ます。記法は、宣言
が (?<name>...)、参照が \g{name} です。 (中略)同じパターンの中に同じ名前の
違うグループがある場合、この名前での参照は一番左で定義されたものを仮定します。
”
以上、よろしくお願いいたします。
|
|