HMJRE.DLLのFindRegular関数No.00530
h-tom さん 07/03/07 17:28
 

h-tom です。

 「hidesoft.2:22677| 正規表現「$」と改行」 関連になるかな?

ちなみに、私は改行文字が"[^X]$"にマッチしないという発想は、なかったですね。
"$"が\nの先頭と末尾にマッチするとかではなく、改行文字なんだから行末だろう、
という単純な考えですが。

さて、本題。
1)同じ事を、マクロを使って、変数を対象にやってみたら、"[^X]$"が"\n"に
 マッチしません。a、c、f、gにはマッチします。

2)確認の意味もあり、正規表現を"$"にすると、"\n"の位置を返しますが、
 検索開始位置が、変数の長さを越えても、戻り値が-1にならず、検索開始位置
 を、そのまま返します。
 正規表現が"$"でなければ、-1になります。

3)正規表現を"^"にすると、aの位置を返しますが、それ以降、検索開始位置を
 かえて検索しても、ヒットしません。
 行頭なのでb、d、gにもマッチするかと思いましたが、aだけしかマッチしま
 せん。


//       01 234 5678 9
$name = "a\nbc\ndef\ng";
loaddll hidemarudir + "\\hmjre.dll";
if(!result){
    message "DLLのロードに失敗しました。";
    endmacro;
}
#st = 0;
while(1){
    #ret = dllfunc("FindRegular","[^X]$", $name, #st);
    //正規表現にマッチすると-1より大きい値を返す。
    if(#ret > -1){
        //マッチした部分の長さを取得
        #len = dllfunc("GetLastMatchLength");
        $match  = midstr($name, #ret, #len);
        message "match -> " + $match + "\n#st=" + str(#st) + " #ret=" + str
(#ret) + " #len=" + str(#len);
    }else{
        break;
    }
    //無限ループ防止
    if(#st > (strlen($name) + 5)) break;
    #st = #ret + 1;
}
freedll;
endmacro;

[ ]
RE:00530 HMJRE.DLLのFindRegular関数No.00532
秀丸担当 さん 07/03/07 18:44
 

>ちなみに、私は改行文字が"[^X]$"にマッチしないという発想は、なかったですね。
>"$"が\nの先頭と末尾にマッチするとかではなく、改行文字なんだから行末だろう、
>という単純な考えですが。
>
>さて、本題。
>1)同じ事を、マクロを使って、変数を対象にやってみたら、"[^X]$"が"\n"に
> マッチしません。a、c、f、gにはマッチします。

$は、\nの直前と、変数の最後にマッチしていると思うので、正しいと思います。

>2)確認の意味もあり、正規表現を"$"にすると、"\n"の位置を返しますが、
> 検索開始位置が、変数の長さを越えても、戻り値が-1にならず、検索開始位置
> を、そのまま返します。
> 正規表現が"$"でなければ、-1になります。

これは少しおかしいかもしれないですね。
調べる必要がありそうです。

>3)正規表現を"^"にすると、aの位置を返しますが、それ以降、検索開始位置を
> かえて検索しても、ヒットしません。
> 行頭なのでb、d、gにもマッチするかと思いましたが、aだけしかマッチしま
> せん。

^は、変数の最初だけで、変数の中の\nの直後にはヒットしません。
基本的には一行ずつです。
検索文字列に\nを使って複数行の検索をしたいという目的のために、改行を含ん
だバッファの渡し方や$の特別な解釈があります。
^を特別な解釈をする必要は無いので、これはこれでいいと思います。

[ ]
RE:00532 HMJRE.DLLのFindRegular関数No.00533
h-tom さん 07/03/07 20:30
 

h-tom です。

>>2)確認の意味もあり、正規表現を"$"にすると、"\n"の位置を返しますが、
>> 検索開始位置が、変数の長さを越えても、戻り値が-1にならず、検索開始位置
>> を、そのまま返します。
>> 正規表現が"$"でなければ、-1になります。
>
>これは少しおかしいかもしれないですね。
>調べる必要がありそうです。
よろしくお願いします。

>^は、変数の最初だけで、変数の中の\nの直後にはヒットしません。
>基本的には一行ずつです。
了解です。
基本的には、sedやawkと同じって事ですね。
(rubyやPrelと同じと考えてました。)

[ ]
RE:00533 HMJRE.DLLのFindRegular関数No.00534
Buckeye さん 07/03/07 20:52
 
h-tomさん、

>>^は、変数の最初だけで、変数の中の\nの直後にはヒットしません。
>>基本的には一行ずつです。
>了解です。
>基本的には、sedやawkと同じって事ですね。
>(rubyやPrelと同じと考えてました。)

Perlも同じだと思いますけど。(他はまともに使っていないのでよく知りませ
ん)

「\nの直後にヒットさせる」ということは、変数中に\nがあるということ、つま
り、多数行をまとめて、その中で検索しているってことですよね。ということは、
Perlならmオプション付きの検索なんじゃないですか? その場合、Perlでも、
変数の中の\nの直後にはヒットしないはずだと思いますけど。

Best regards,
Buckeye

[ ]
RE:00534 HMJRE.DLLのFindRegular関数No.00536
h-tom さん 07/03/07 21:54
 

h-tom です。

>「\nの直後にヒットさせる」ということは、変数中に\nがあるということ、つま
>り、多数行をまとめて、その中で検索しているってことですよね。ということは、
>Perlならmオプション付きの検索なんじゃないですか? その場合、Perlでも、
>変数の中の\nの直後にはヒットしないはずだと思いますけど。
mオプションだけでなく、gオプションもつければヒットしますよ。

[ ]
RE:00536 HMJRE.DLLのFindRegular関数No.00537
Buckeye さん 07/03/07 22:14
 
h-tomさん、

HMJRE.DLLのFindRegular関数って直接使ったことがないのでわからないのですが、
Perlのgオプション相当のオプション、あるんですか?

Best regards,
Buckeye

[ ]
RE:00537 HMJRE.DLLのFindRegular関数No.00538
h-tom さん 07/03/07 22:42
 

h-tom です。

>HMJRE.DLLのFindRegular関数って直接使ったことがないのでわからないのですが、
>Perlのgオプション相当のオプション、あるんですか?
ありませんが、検索開始位置が指定できるので、ずらしていけば、全て検索
出来るでしょう。

[ ]
RE:00530 HMJRE.DLLのFindRegular関数No.00539
秀まるお さん 07/03/07 23:02
 
> 2)確認の意味もあり、正規表現を"$"にすると、"\n"の位置を返しますが、
>  検索開始位置が、変数の長さを越えても、戻り値が-1にならず、検索開始位置
>  を、そのまま返します。
>  正規表現が"$"でなければ、-1になります。

 これはHmJre.dll側のバグのようです。次のV1.81にて修正させていただきます。

 ちなみにこれの件とは別に、" + + + +"のようなパターンで遅い問題対応と、
これの調査をしてる時に見つけた別のパターンでのバグ修正もいっしょにやりま
す。

[ ]
RE:00538 HMJRE.DLLのFindRegular関数No.00540
Buckeye さん 07/03/08 08:05
 
h-tomさん、

>>HMJRE.DLLのFindRegular関数って直接使ったことがないのでわからないのですが、
>>Perlのgオプション相当のオプション、あるんですか?
>ありませんが、検索開始位置が指定できるので、ずらしていけば、全て検索
>出来るでしょう。

ああ、そういう意味ですか。

「検索開始位置をずらす」操作を、Perlのgオプション相当としてとらえられて
いるわけですね。たしかに、そういうイメージの操作になるはずですが、Perlも
gオプションをつけただけでは、^は変数の中の\nの直後にヒットしませんよね。

    この後を書く前に、私の#534を訂正。大ボケを書いてました。変数中に\nが
    あってもmオプションとはかぎりません。変数中に\nがあったとき、その\n
    で区切って多数の変数であるかのように処理させるオプションがm、ですか
    ら。つまり、HMJRE.DLLのFindRegular関数の動作は、Perlでオプションなし、
    素の動作に相当しているわけでしょう。

で、この訂正を前提に書くと……まず、Perlのgオプション相当の動作をさせる
ためには、ユーザ側で「検索開始位置をずらす」操作をすればいい。それはh-
tomさんがおっしゃるとおりですが、
m/^/g
では、変数の中の\nの直後にはヒットしないはずです。ヒットさせるには、mオ
プションも必要で、
m/^/mg
としてやる必要があります。

だから、「検索開始位置をずらす」操作をPerlのgオプション相当だと考えるな
ら、今のFindRegular関数の動作は(Perl的に見ても)正しいってことになりま
す。

じゃあ、mオプションを実現するためにはどうしたらいいかと言えば……mオプシ
ョンがなかったPerl4時代にやられていた形、つまり、変数を\nで分割して食わ
せるんでしょう。

HMJRE.DLLのFindRegular関数にPerlのオプションまで含めて処理させるのか、そ
れとも、オプション部分はユーザ側が実現するのか、という側面において、今、
gオプションがユーザ側にゆだねられているのなら、mオプションもユーザ側にゆ
だねるのが首尾一貫しているように思えます。(別に、よく使うものはHMJRE.
DLL側で処理してくれてもいいと思いますが)

という具合につらつら考えると、HMJRE.DLLのFindRegular関数が、現在、Perlと
は異なりsedやawkと同じであるというのは、認識の仕方としてちょっと違うので
はないかなと思いますし、他人にそういう説明をされると誤解を招く場合もあり
そうだなと思います。まあ、認識は認識にすぎないので、個々人が自分にわかり
やすくすればいいと言えばそのとおりですが。

Best regards,
Buckeye

[ ]