タグ付き正規表現の \0 についてNo.08913
白雲斎 さん 05/12/12 12:25
 
今日は、白雲斎です。

タグ付き正規表現の \0 が意味するところを、もう少し詳しく説明した方が
良くないですか?

"\f" を用いたダグ付き正規表現のヘルプでは、
『置換先の文字列で、\0、\1、\2…といった形で検索元文字列を利用する』
とあり、"\0" が利用できることが分かります。
一方、「一般的正規表現互換のタグ付き正規表現」のヘルプでは、
\0 に関する記述はありません。

このことを念頭において、

xxxabcxxx
xxxdefxxx

上2行のテキストを、下の2種類で置き換えを実行します。

(1).
検索:(abc|def)
置換:<\0>
結果:
xxx<abc>xxx
xxx<def>xxx

(2).
検索:(abc|def)
置換:<\1>
結果:
xxx<abc>xxx
xxx<def>xxx

結果は、どちらも同じになります。
また、下の3種類で置き換えを実行します。

(3).
検索:.*(abc|def)
置換:<\0>
結果:
<xxxabc>xxx
<xxxdef>xxx

(4).
検索:.*(abc|def)
置換:<\1>
結果:
<abc>xxx
<def>xxx

(5).
検索:.*(abc|def)
置換:\0<\1>
結果:
xxxabc<abc>xxx
xxxdef<def>xxx


「"\f"を用いたダグ付き正規表現」
「一般的正規表現互換のタグ付き正規表現」
の双方を理解しているつもりでも、時たま頭が混乱してしまいます。
まして、どちらか一方のみしか知らない人が、もう片方を利用する時、
混乱しないでしょうか?


[ ]
RE:08913 タグ付き正規表現の \0 についてNo.08915
秀まるお さん 05/12/12 12:46
 
 \0の扱いですが、これはこれでややこしい問題があって、現状では「検索でヒ
ットした文字列全体」を返す仕様になっているようです。

 なぜかというと、"\f"で区切る仕組みしか無かった時代に、\0はそういう仕様
だったからです。そういうマクロとの互換性を維持するために、\0だけは例外動
作になってます。

 基本としては、

 旧タグ方式…\fで区切って\0〜\9で指定する
 新タグ方式…()囲みで区切って\1〜\9で指定する

 ということですが、新タグ方式のつもりで\0を間違って使ったケースについて
は、それはそれで例外的に旧タグ方式扱いされる、ということなります。

 このことがヘルプに書いてないがために戸惑ったってことでしたら、ご迷惑お
かけしてすみません。

[ ]
RE:08915 タグ付き正規表現の \0 についてNo.08920
白雲斎 さん 05/12/12 22:26
 
こんばんは、白雲斎です。

いや、ヘルプに詳しい説明を追加してください。的な発言のつもりだったんで
すが、わざわざコメントくださり恐縮です。それでは、よろしくお願いしま
す。

[ ]