正規表現で質問No.00634
YK さん 99/07/11 11:16
 
今日は。はじめまして、YKといいます。質問があります。
いま、マクロを作っていますが、スピードがイマイチです。
次のような処理が多いのですが、正規表現検索のやり方がよく分かりません。
もし、良い方法があれば教えていただけないでしょうか。

質問1:正規表現検索に否定は有りますか。
たとえば、" "と" "と0x09でない文字の検索がやりたいでのですが。

$c=NOT(" | |char(0x09)");
searchdown $c, regular;

質問2: 現状、質問1は以下のやりかたでやっています。次の処理の、うまい高
 速化方法は無いでしょうか。

#spaceZ = ascii(" ");
    while(1){
        if (code == 0x20 ) right;
        else if ( code == 0x09) right;
        else if (code == #spaceZ) right;
    else break;
    }


[ ]
RE:00634 正規表現で質問No.00635
きいろいまふらあ さん 99/07/11 13:15
 
YKさんこんにちは。
きいろいまふらあです。

>質問1:正規表現検索に否定は有りますか。

[]と^を併用すると補集合を表現できます。
例えば[^A]はA以外の任意の1文字を表します。
[^ABC]ならAでもBでもCでもない1文字です。

>たとえば、" "と" "と0x09でない文字の検索がやりたいでのですが。

これは[^  \x09]でいける、かな?
マクロで書くときは、えーとどうするんだっけ?(^^;

serachdown "[^  \\x09]", regular;

でいいんだっけか???
お試し下さい。

まふ

[ ]
RE:00634 正規表現で質問No.00636
ひろ さん 99/07/11 15:48
 
 YKさん今日は、ひろです。
> 質問1:正規表現検索に否定は有りますか。
 1 文字単位の否定なら秀丸の正規表現でも行えます。
> たとえば、" "と" "と0x09でない文字の検索がやりたいでのですが。
 この場合「[^  \t]」でよいと思います。
> $c=NOT(" | |char(0x09)");
 ただし macro 中で使う場合は、
$c=[^  \\t];
と書く必要が有ります。

> 質問2: 現状、質問1は以下のやりかたでやっています。次の処理の、うまい高
>  速化方法は無いでしょうか。
#code=code;
while(#code==0x20||#code==0x09||#code==0x8140){
  right;
  #code=code;
}
で如何でしょうか? 毎回 code を使わない分少し早はくなると思います。

[ ]
RE:00634 正規表現で質問No.00637
安久津 さん 99/07/11 16:53
 
はじめまして YKさん、安久津といいます。

>質問2: 現状、質問1は以下のやりかたでやっています。次の処理の、うまい高
> 速化方法は無いでしょうか。
速くなるかどうかは分かりませんが、こんな感じ。

[方法A] while と if をまとめちゃう。
while( code == 0x09 || code == 0x20 || code == 0x8140 ) right;

[方法B] OR 判定が多くなった場合( 番頭++さんの発言#00589 も参照して )
$NOT = "\t  ";
while( strstr( $NOT, char(code) ) != -1 ) right;

質問1:と関連して searchdown のこと。
取得したい文字の検索によって、要らない文字をスキップする場合には、
検索開始位置に注意して下さい。
検索開始位置が [^\t  ] 文字の場合には、その文字自体にはマッチしません。

ではでは。
# まふさんの MLT_NUM.MAC は不動の Ctrl + 1

[ ]
RE:00634 みなさん、ありがとうございましNo.00638
YK さん 99/07/13 00:10
 
きいろいまふらあさん、ひろさん、安久津さん
こんにちは、YKです。

みなさん、早速のアドバイスありがとう御座いました。
お陰様で、上手くいきました。確かに速くなりました。
部分的な変更でしたが、10%弱の速度改善ができました。
今後、みなさんのアドバイスをマクロ全体に展開しようと考えています。
大変ありがとう御座いました。


[ ]
RE:00636 正規表現で質問No.00639
きいろいまふらあ さん 99/07/13 00:23
 
まふです。

ひろ wrote on Sun, 11 Jul 1999 15:48:50 +0900
>  ただし macro 中で使う場合は、
> $c=[^  \\t];
> と書く必要が有ります。

検索文字列をあらかじめ変数に代入しておくという意味では
$c = "[^  \\t]";
と、""で括らないとまずいですね、きっと。

ちょっと揚げ足取りでした。失礼。

まふ

[ ]
RE:00639 正規表現で質問No.00641
ひろ さん 99/07/13 17:46
 
 きいろいまふらあさん今日は、ひろです。
> 検索文字列をあらかじめ変数に代入しておくという意味では
> $c = "[^  \\t]";
> と、""で括らないとまずいですね、きっと。
 仰る通りです(^^;。

[ ]