続多重括弧でくくられた文字の強調No.03737
安久津 さん 03/05/22 14:32
 
あくつです。
> Date: Tue, 20 May 2003 18:41:05 +0900
> From: nari <9xxxxxxxxxxxxxx@maruo.co.jp>
> Subject: hidesoft.2:14705| 多重括弧でくくられた文字の強調表示

これは、ネストレベルを一致させるものではありません。
代替案です。

(1) 入れ子を一切みとめないカッコ:  \([^()]+\)
(2) (1)のカッコを含めるカッコ   :  \((?:[^()]|\([^()]+\))+\)

すると次のようになります。( 包含関係を示すインデントつき )

                                            \([^()]+\)
                                 \((?:[^()]|\([^()]+\))+\)
                      \((?:[^()]|\((?:[^()]|\([^()]+\))+\))+\)
           \((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]+\))+\))+\))+\)
\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]+\))+\))+\))+\))+\)

上から優先順序の高い強調表示に割り当てます。

===========================================================================
//bregif & bregex 版
//kakko.hilight
//\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]+\))+\))+\))+\))+\)
//17, HIGHLIGHT 1
//81, HIGHLIGHT 2
//145,HIGHLIGHT 3
//209,HIGHLIGHT 4
17,\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]+\))+\))+\))+\)
81,\((?:[^()]|\((?:[^()]|\([^()]+\))+\))+\)
145,\((?:[^()]|\([^()]+\))+\)
209,\([^()]+\)


    (1 (2 (3 (4) 3) 2) (2) 1)
             ~~~       ~~~
    これはネストを調べるものではないので、
    (4) と (2) が同じハイライトになります。
    ~~~    ~~~
===========================================================================
//これが上手く行くか不明。テストしていません。
//標準 jre32.dll 版
//kakko.hilight
17,\(([^()]|\(([^()]|\(([^()]|\([^()]+\))+\))+\))+\)
81,\(([^()]|\(([^()]|\([^()]+\))+\))+\)
145,\(([^()]|\([^()]+\))+\)
209,\([^()]+\)

===========================================================================
アルビレオさん書く。
>(1(2)1(2(3)2(3(4)3)2)1(2(3)2)1)
>↓
>(1(2)1(222)1(22)1)
>
>なんてことを
>検索:foo
>置換:bar
>という記述でできるかどうかという問題なんですが。

$ perl -v | head -3

This is perl, v5.6.1 built for i386-linux-thread-multi

$ cat paren.pl
#!/usr/bin/env perl

while(<>){
 while( m/(\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\([^()]*)\((?:[^()]|\([^()]
*\))*\)/ ){
  s/(\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\([^()]*)\((?:[^()]|\([^()]*\))*
\)/$1/;
 }
 print;
}

$ cat a.tmp
(1(2)1(2(3)2(3(4)3)2)1(2(3)2)1)
(1(2)1(22(3(4)3)2)1(2(3)2)1)
(1(2)1(222)1(2(3)2)1)
(1(2)1(222)1(22)1)

(1(2)1(2()2((4))2)1((3)2)1)
$ perl paren.pl a.tmp
(1(2)1(222)1(22)1)
(1(2)1(222)1(22)1)
(1(2)1(222)1(22)1)
(1(2)1(222)1(22)1)

(1(2)1(222)1(2)1)
$ exit

    先読み後読みを使って、一発でできるかも。(^^;)

では。

[ ]
RE:03737 続多重括弧でくくられた文字の強No.03743
ENCODINGSHIFTJIS さん 03/05/23 14:47
 
>    先読み後読みを使って、一発でできるかも。(^^;)

//bregif & bregex 版
//kakko.hilight
145,\((?:[^()]|\((?:[^()]|(?:[^()]|\((?:[^()]|\([^()]+\))+\)))+\))+\)

はできました。

(?:[^はじめおわり]|[はじめ][^はじめおわり][おわり])+

の二番目の[^はじめおわり]に自分自身を繰り込む形です。
正規表現のミスで秀丸が消えやすいので、テストは十分にですね

[ ]