replaceup の仕様No.06140
山紫水明 さん 10/10/04 21:10
 
正規表現によるマクロの上方向置換に関しての質問です。

次のようなデータを用意します。

123
1234
12345
123456
1234567
12345678
123456789
1234567890

カーソルを末尾において以下のマクロを実行します。

//----------------------------------------------------
while( 1 ) {
    replaceup "(?<=[0-9])([0-9]{3})", ",\\1", regular;
    if( !result ) break;
}
endmacro;
//----------------------------------------------------

期待する結果は,

123
1,234
12,345
123,456
1,234,567
12,345,678
123,456,789
1,234,567,890

ですが,実際には次のようになります。

123
1,234
1,2345
123,456
123,4567
1,2345,678
1,2345,6789
123,4567,890

指定の仕方がおかしいのでしょうか?

ちなみに置換の部分の 3 を 2 に変えて
    replaceup "(?<=[0-9])([0-9]{2})", ",\\1", regular;
とすると,

1,23
1,234
1,23,45
1,23,456
1,23,45,67
1,23,45,678
1,23,45,67,89
1,23,45,67,890

となります。この場合も不完全です。

              山紫水明

[ ]
RE:06140 replaceup の仕様No.06144
秀丸担当 さん 10/10/05 12:34
 

マクロの通りにして確認することができました。
調べてみたところ、前方一致がある場合は開始位置よりも前の部分は対象になら
ないようになっていることが理由でした。

HmJre.dllのFindRegularの例で言うと、以下のようなマクロで

loaddll "hmjre.dll";
#n = dllfunc( "FindRegular", "(?<=[0-9])([0-9]{3})", "123456789", 1 );
if( #n >= 0 ) {
    message str(#n);
}

開始位置は 1 なので 1 にヒットするのを期待したいところが、開始位置より前
は前方一致の対象とならないため、2 がヒットすることになっていました。

このため、検索で下候補で([0-9])([0-9]{3})とすると1つずつヒットするのに
対し、
(?<=[0-9])([0-9]{3})の場合は飛び飛びにヒットするため、ずれが発生していま
した。
上候補も同じ理由で飛び飛びになる結果となるようです。

以前にHmJre.dllで(?<=pattern1)(pattern2)と(pattern1)(pattern2)の結果が違
うという報告があったようで、同じにするために現在の仕様となったようです。

現状ではこういう仕様ということでお願いします。

今回のケースの場合を回避するには、
検索文字列:([0-9])([0-9]{3})
置換文字列:\1,\2
というようにするといいかもしれません。

[ ]
RE:06144 RE:replaceup の仕様No.06145
山紫水明 さん 10/10/05 22:22
 
 秀丸担当さん,

 くわしいご説明ありがとうございます。

>現状ではこういう仕様ということでお願いします。
 了解いたしました。
                                    山紫水明

[ ]