マクロでの正規表現を使った置換についてNo.00687
you さん 99/08/03 20:52
 
はじめましてyouといいます
今秀丸でマクロを作っているんですけど
置換にはどうやって…何処の部分に”.replaceall”をつければ良いのでしょうか?

あと普通の正規表現の置き換えもうまく行きません

 "dg-50 60 120"

という文字列を

  "dg-50 60 30"

としたい場合

検索 "dg-08\f.+\f[0-9]+$"

置換 "\0\130"

とすると結果が

"dg-50 60 1230"

となってしまいます、
お願いします助けてください。


[ ]
RE:00687 マクロでの正規表現を使った置換No.00688
番頭++ さん 99/08/04 12:04
 
> "dg-50 60 120"
>という文字列を
>  "dg-50 60 30"

検索    "dg-50 60 \f[0-9]+$"
置換    "\030"

マクロでは、\\ とかきますが、これでいけませんか !!!

//*1    a1.mac
    replacedown "dg-50 60 \\f[0-9]+$", "\\030", regular, ask;
endmacro;

[ ]
RE:00687 マクロでの正規表現を使った置換No.00689
きいろいまふらあ さん 99/08/04 17:56
 

>はじめましてyouといいます
>今秀丸でマクロを作っているんですけど
>置換にはどうやって…何処の部分に”.replaceall”をつければ良いのでしょうか?
>
replaceall は replaceコマンドのパラメータではありません。
それ自身がコマンドです。

replaceall "hogehoge", "fugafufa";

みたいな感じで使います。

> "dg-50 60 120"
>
>という文字列を
>
>  "dg-50 60 30"
>
>としたい場合
>
>検索 "dg-08\f.+\f[0-9]+$"

検索 "dg-50\f.+\f[0-9]+$"

とされているんでしょうね、きっと。

真ん中の".+"に対して「最長一致」の原則が働くので

"dg-50" に "dg-50" が、
".+" に " 60 12" が、
"[0-9]+$" に "0" が対応してしまうのでしょう。

"dg-50 60 "までは固定、ならば

replace "dg-50 60 \\f[0-9]+$", "\\030";

とすればよいでしょう、多分。
真ん中の "60" も可変なら

replace "dg-50 \\f[0-9]+\\f \\f[0-9]+$", "\\0\\1 30";

とでもすればいいのでしょうか?
最終的になさりたいことがちょっと把握できないのですが、
ま、だいたいそんなとこです。

助かりました?(^_^)

----
Go TAKAGI  xxxx@pluto.dti.ne.jp

[ ]
RE:00689 マクロでの正規表現を使った置換No.00691
番頭++ さん 99/08/04 19:48
 
>真ん中の".+"に対して「最長一致」の原則が働くので

replaceall "^.+\\f.+\\f.+\\f.+$", "\\0|\\1|\\2|\\3", regular, ask;
を行うと、

123
1234
11223344



123
1|2|3|4
11223|3|4|4

になるんですね、なんとなく納得できます ...

replaceall "^.*\\f.*\\f.*\\f.*$", "\\0|\\1|\\2|\\3", regular, ask;
を行うと、

12|||3
123|||4
1122334|||4

正しいうごきかな ???

replace; // はダイアログが出てきます、アゲアシをとってすみません ...
replacedown か replaceup の勘違いでしょう。

[ ]
RE:00687 マクロでの正規表現を使った置換No.00692
you さん 99/08/04 20:45
 
 番頭++さん、きいろいまふらあさんありがとうございます
なんとか置換のマクロまでは書けました、(かなり助かりました)
 で、もう一つ質問なんですけど、グレープしたファイルから違う
ファイルにジャンプしたときは別のマクロを実行しないと
マクロを続けることはできないんですか?

  

[ ]
RE:00692 マクロでの正規表現を使った置換No.00693
you さん 99/08/04 21:00
 
すいま追加です
マクロファイルの実行に失敗して別のマクロを開こうとすると
別のマクロが実行中で開けないことがあるんですけど
これは全ての秀丸を終了させないと新しいマクロを読み込むことはできないんでしょ
うか

[ ]
RE:00691 マクロでの正規表現を使った置換No.00694
きいろいまふらあ さん 99/08/04 23:41
 
まふです。
最長一致、検証していただいたんでしょうか?
ありがとうございます。
#自分で書きながら「ほんとかな?」って……。(^^;

> 正しいうごきかな ???

".*" が「長さ0以上の任意の?文字列」と考えれば正しい、のか?

でもいま秀丸のヘルプ(Help Version 3.00.00)見たら

>また、\fでの区切りがあいまいになるような表現もいけないです。例えば
>  A\f.+\f.+
> のように、どうにでも解釈できるような区切り位置は指定しないでください。

とか書いてあったりして。(^^;

> replacedown か replaceup の勘違いでしょう。

ですね。失礼しました。
#自分で動かしてないの、ばればれ。(^^;

まふ

[ ]
RE:00694 マクロでの正規表現を使った置換No.00695
番頭++ さん 99/08/05 12:15
 
>でもいま秀丸のヘルプ(Help Version 3.00.00)見たら
>>また、\fでの区切りがあいまいになるような表現もいけないです。例えば
>>  A\f.+\f.+
>> のように、どうにでも解釈できるような区切り位置は指定しないでください。
>とか書いてあったりして。(^^;

この件は、
"秀丸エディタカラーバージョンβテスト" に、[ \f で検索する ]
RE:02131 タグ付き正規表現の置換
Arimacさんと秀まるおさんの投稿があります。

[ ]
RE:00693 マクロでの正規表現を使った置換No.00696
番頭++ さん 99/08/05 12:28
 
>マクロファイルの実行に失敗して別のマクロを開こうとすると
>別のマクロが実行中で開けないことがあるんですけど
>これは全ての秀丸を終了させないと新しいマクロを読み込むことはできないんでし
>ょうか

仕様と言うか、バグというか、
マクロの実行を失敗すると、常駐の「秀丸」をすべて閉じることになる場合がありま
す。
ひどい場合には、Windows を再起動します。

[ ]
RE:00692 マクロでの正規表現を使った置換No.00697
番頭++ さん 99/08/05 12:29
 
> で、もう一つ質問なんですけど、グレープしたファイルから違う
>ファイルにジャンプしたときは別のマクロを実行しないと
>マクロを続けることはできないんですか?

一つの Windows で「秀丸」は複数起動できますが、マクロは一つしか起動でき
ません。別の表現ですとマクロは複数の「秀丸」を操作できます。マクロのヘル
プで「秀丸管理」を見てください。

//  "(&G) grep - わからん ! "
ppkn_grep1:
    $wk1 = input(directory2+"\n\ngrep - 検索する文字列 ?","[0-9][0-9]\\.[0-
9][0-9]");
    if( ! result ){ endmacro;   }
    if( strlen($wk1) == 0 ){
        grepdialog;
        if( ! result ){ endmacro;   }
        if( iskeydown( 0x1B ) ){    //  [Esc]
            if( basename == "" && x+y == 0 ){
                quit;   endmacro;
            } else {
                endmacro;
            }
        }
    } else {
        grep $wk1, "*.*", directory2, regular, icon;
    }
    if( basename == "" && code == eof ){
        quit;   endmacro;
    }
    config "t4 w200";   readonlyswitch;
    while( ! iskeydown( 0x1B ) ){   //  [Esc]
        setactivehidemaru 0;    title 1;
        if( basename == "" ){
            inputpos "わからん ! - [Enter] : tagjump;";
            if( iskeydown( 0x1B ) ){    break;  }   //  [Esc]
            golinetop2; tagjump;
        } else {
            inputpos filename2 + " - わからん ! - [Enter] : backtagjump;";
            if( iskeydown( 0x1B ) ){    break;  }   //  [Esc]
            golinetop2; backtagjump;
        }
        #i = hidemarucount;
        if( #i > 5 ){
            closehidemaru #i-1; closehidemaru 5;
        }
    }
    #i = hidemarucount;
    while( #i > 1 ){
        #i = #i - 1;    closehidemaru #i;
    }
    title 1;
    setsearch "", 0x00; //  reset. 記憶にありません !
endmacro;


[ ]
RE:00697 マクロでの正規表現を使った置換No.00701
番頭++ さん 99/08/05 17:55
 
適当なサンプルがあったので少し改造しました。

新規の空の (無題) ファイルを一つだけ開いて、
このマクロを実行してみてください。

//*1    a1.mac
    $msg1 = " : [Enter] - 切り替え、[Esc] - 終わり";    //  です !
    $msg2 = "a1.txt a2.txt を閉じないとこのマクロは動きません。";
    $msg3 = "a1.txt a2.txt が在るディレクトリではこのマクロは動きません。";
    $dir1 = directory2;
    gofiletop;
    if( basename2 != "" || (x+y) != 0 ){    endmacro;   }   //  無題、空 !
    $file_self = filename2;
    call pp_check1 "a1.txt";
    call pp_check1 "a2.txt";
    insertfix "はじまり";
    call pp_open1 "a1.txt";
    call pp_open1 "a2.txt";
    setactivehidemaru hidemaruhandle(findhidemaru("a1.txt"));
    inputpos filename2 + $msg1;
    #i = 0;
    while( ! iskeydown(0x1B) ){
        if( basename2 == "a1.txt" ){
            setactivehidemaru hidemaruhandle(findhidemaru("a2.txt"));
        } else {
            setactivehidemaru hidemaruhandle(findhidemaru("a1.txt"));
        }
        #i = #i + 1;
        if( #i >= 5 ){  break;  }   //  これ以上は、アキルでしょう
        inputpos filename2 + $msg1;
    }
    setactivehidemaru hidemaruhandle(findhidemaru($file_self));
    closehidemaruforced hidemaruhandle(findhidemaru("a1.txt"));
    closehidemaruforced hidemaruhandle(findhidemaru("a2.txt"));
    quit;
endmacro;

pp_check1:
    if( $$1 == basename2 ){ call pp_endmacro $msg2; }
    if( findhidemaru($$1) != -1 ){  call pp_endmacro $msg2; }
    if( existfile($dir1+"\\"+$$1) ){    call pp_endmacro $msg3; }
//  message str(existfile($dir1+"\\"+$$1)); //  bug ???
//  message $dir1+"\\"+$$1;
return;

pp_open1:
    openfile $$1;
    insert filename + "\n";
    #i = 5;
    while( #i != 0 ){
        insert str(#i) + "\n";
        #i = #i - 1;
    }
    gofiletop;
return;

pp_endmacro:
//  message filename2 + "\n\n" + $$1;
    message $$1;
endmacroall;


[ ]