入れ子になった括弧を検索や強調表示するNo.38014
fzok4234 さん 20/02/28 01:37
 
お世話になっております。

さて、例えば

( a, ( b, c ), d, ( e, ( f, ( g, h ) ), i ), j )

のように正しく入れ子になった括弧からなる文字列を検索したり強調表示したりする
方法が分かりません。文字列全体はもちろんのこと、括弧だけや囲われた文字だけに
マッチさせたいのですが、どうしても正規表現のパターンが思いつかないのです。

当方で、例えば

( a, ( b, c ), d, ( e, ( f, g, h ) ), i ), j )

のように括弧の入れ子関係が誤った場合を除外して入れ子関係の正しい場合のみにマ
ッチさせる必要が出てきて困っています。

どうかご教示よろしくお願いします。



[ ]
RE:38014 入れ子になった括弧を検索や強調No.38015
秀丸担当 さん 20/02/28 09:48
 

まず、他の方も見られているかもしれないので、標準機能としては[その他]→[ファ
イルタイプ別の設定]→[デザイン]にある「対応する括弧の強調表示」をONにしてお
くと、カーソル位置の対応する括弧を強調するようになります。これで視覚的に対応
が合っているかどうかを見ることができます。
あと、キー割り当てで「対応する括弧に移動」というコマンドもあります。(標準で
Ctrl+K)

それはそれとして、括弧の対応全体を検索したり強調表示するのを正規表現で書くの
は大変だと思います。
マクロで調べたほうがいいかもしれません。
例えば、括弧の対応を色付けするとしたら、以下のような感じで調べならが色付けす
るマクロにすると、自由にできると思います。
この例はカーソル行だけを調べています。

disabledraw;
$layer="mykakko";
#c=column;
#l=lineno;
selectline;
deletecolormarker $layer;
moveto2 0,#l;
#acr[0]=0xffdddd;
#acr[1]=0xffaaaa;
#acr[2]=0xff8888;
#acr[3]=0xff6666;
#acr[4]=0xff4444;
#acr[5]=0xff2222;
#ccr=6;
#nest=0;
while(1){
    if(code==0x0d||code<0){
        break;
    }
    if(code==0x28){//0x28=(
        if(#nest>0){
            colormarker -1,#acr[#nest%#ccr],-1,0,0,$layer,lineno,#cPrev,line
no,column;
        }
        #cPrev=column;
        #nest=#nest+1;
    } else if(code==0x29){//0x29=)
        if(#nest>0){
            colormarker -1,#acr[#nest%#ccr],-1,0,0,$layer,lineno,#cPrev,line
no,column+1;
        }
        #nest=#nest-1;
        #cPrev=column+1;
    }
    right;
}
moveto2 #c,#l;


あと、マニアックな方法ですが[その他]→[ファイルタイプ別の設定]→[デザイン]→
[複数行コメント]で、ユーザー定義にして、括弧から括弧までを強調する指定にする
方法も考えられます。
ユーザー定義の追加で、正規表現で、開始文字列「\(」、終了文字列「\)」として、
「オプション(O)>>」を出して「自身の入れ子を許可」をONにすると、入れ子になっ
た括弧の自動的な色付けができます。
これだけだと、1つずれると複数行にわたってずれまくるので、行内にするとしたら、
開始文字列「\(」、終了文字列「\)|$」にしておくといいです。



[ ]