数値を3桁毎に,を入れるNo.06714
Iranoan さん 11/09/12 00:58
 
 秀丸担当さん今日は、Iranoan です。
http://www.maruo.co.jp/hidesoft/2/x30217_.html#30261
の流れで、表題の操作を置換でできないか考えたのですが、正規表現の振る舞
いで解らない事があります。
 128000000
との文字列があった時、ファイル末尾から上方置換をします。この時、置換文
字列を「,\0」とし、
    検索文字列      |   置換後    |   補足
(?<=[0-9])[0-9]{3}  | 12800,0000  |4 桁になる
(?<=[0-9])[0-9]{2}  | 1280000,00  |2 桁になる
繰り返し回数が一つ増えただけで、区切りが二つ増えるのはなぜでしょう。後
方置換と結果を同じにするためでしょうか?
 こちらの環境は、WindowsXP+IE8.0+秀丸 Ver.8.11b06 です。

[ ]
RE:06714 数値を3桁毎に,を入れるNo.06715
秀丸担当 さん 11/09/12 09:14
 

>繰り返し回数が一つ増えただけで、区切りが二つ増えるのはなぜでしょう。後
>方置換と結果を同じにするためでしょうか?

サンプルの通りにして確認することができました。
まず、この正規表現で上から下検索をすると、1つずつではなく、1つ飛びにヒ
ットしてしまいます。
これは、いまのところ前方一致指定の仕様になっています。
 参考:
 http://homepage3.nifty.com/kons/hidemaru/helpsite/hmjre/html/0003_ABOUT_REGULAR.html

下検索で最後にヒットするのは最後ではなく最後から2番目になってしまします。

上検索は、おっしゃる通り下検索と上検索で結果が一致するように、行内で下検
索を順番に行って最後にヒットするところが、上検索での最初のヒットになりま
す。
そのため、上検索の置換でこうなってしまいます。

この問題を回避するには、
検索文字列 ([0-9])([0-9]{3})
置換文字列 \1,\2
とするといいです。

[ ]
RE:06715 数値を3桁毎に,を入れるNo.06716
hum2 さん 11/09/12 15:21
 
秀丸担当 さん、横から失礼します。

>この問題を回避するには、
>検索文字列 ([0-9])([0-9]{3})
>置換文字列 \1,\2
>とするといいです。

便乗で質問です。
\123456789
\12345678
\1234567
\123456
\12345
\1234
\123
\12
\1

のような場合、3桁毎に,を入れるマクロはどうなりますか?
3桁毎に,を入れるだめな例は、思いつくのですが
記述を直すとしたら、が浮かびません。

よろしくお願いいたします。

/------------------------------------------------/
    setcompatiblemode 0x010F;
    begingroupundo;
    gofileend;
    golineend2;  //      論理行末に移動
 replaceup "\\\\([0-9])([0-9]{3})" , "\\\\\\1,\\2" , regular;
    while (result) findup;
    gofileend;
    golineend2;  //      論理行末に移動
// replaceup "\\\\([0-9]{1,3})([0-9]{3,3})" , "\\\\\\1,\\2" , regular;
    while (result) findup;
    gofileend;
    golineend2;  //      論理行末に移動
// replaceup "\\\\([0-9]{1})([0-9]{3,3})([0-9]{3,3})" , "\\\\\\1,\\2,\\3" ,
regular;
    while (result) findup;
    endgroupundo 1;
/------------------------------------------------/

[ ]
RE:06716 数値を3桁毎に,を入れるNo.06717
秀丸担当 さん 11/09/12 15:43
 

>のような場合、3桁毎に,を入れるマクロはどうなりますか?
>3桁毎に,を入れるだめな例は、思いつくのですが
>記述を直すとしたら、が浮かびません。

いろいろやり方はあると思いますが、以下のような方法だと手っ取り早いと思い
ます。

while(1){
  replaceallfast "(\\\\[0-9]*[0-9])([0-9]{3})","\\1,\\2",regular;
  if(result<=0)break;
}

[ ]
RE:06715 数値を3桁毎に,を入れるNo.06718
Iranoan さん 11/09/12 16:49
 
 秀丸担当さん今日は、Iranoan です。
> 上検索は、おっしゃる通り下検索と上検索で結果が一致するように、行内で下検
> 索を順番に行って最後にヒットするところが、上検索での最初のヒットになりま
> す。
> そのため、上検索の置換でこうなってしまいます。
 やはりそうでしたか。
 ご確認有り難うございます。

[ ]
RE:06717 数値を3桁毎に,を入れるNo.06719
hum2 さん 11/09/12 20:27
 
秀丸担当 さん、うまくいきました。ありがとうございます。

>いろいろやり方はあると思いますが、以下のような方法だと手っ取り早い
>と思います。
>
>while(1){
>  replaceallfast "(\\\\[0-9]*[0-9])([0-9]{3})","\\1,\\2",regular;
>  if(result<=0)break;
>}

[ ]