hmjre.dllの不具合No.06516
colder さん 11/05/16 17:39
 
関数ReplaceRegularNoCaseSense、FindRegularNoCaseSense及び
FindGeneralで大文字小文字を区別しないとき、
正規表現\S \D \Cなどの意味が\s \d \cになっているようです。

正規表現「(.).*\1」が「xaaa」など先頭以外ではマッチしません。
現在は、正規表現を「(.{1}).*\1」と書き換えて対応しています。

正規表現「(?=.{0,3}a)b」が「aba」にマッチしません。
現在は、正規表現を「(?=.{0,3}?a)b」と書き換えて対応しています。

あと、仕様かもしれませんが、
コードポイントがU+10000以上である文字が、
サロゲートペア二文字で表されるため、
文字クラス中で使うと関係ない文字がヒットしたり、
括弧なしで繰り返し指定ができないなど使いにくいです。

環境 win7+秀丸ver8.10β3+hmjre.dll ver3.37

[ ]
RE:06516 hmjre.dllの不具合No.06520
秀まるお さん 11/05/17 11:50
 
 いつもいろいろ調べていただきありがとうございます。

> 関数ReplaceRegularNoCaseSense、FindRegularNoCaseSense及び
> FindGeneralで大文字小文字を区別しないとき、
> 正規表現\S \D \Cなどの意味が\s \d \cになっているようです。

 調べてみたら、たしかに全部小文字に変換してしまってました。「\」付きの
半角英数字は変換せずに通すように修正させていただきます。

> 正規表現「(.).*\1」が「xaaa」など先頭以外ではマッチしません。

 これも調べてみたら再現出来て、原因も特定出来ました。

 高速化のために、「マッチする可能性が無いと分かった所はもうマッチングの
テストをしないでおく」って処理があちこちにあって、それによって高速化をし
てるんですが、それの関係でうまくヒットしてませんでした。

 ということで修正させていただきつつ、いろいろテストもしてみます。

> 正規表現「(?=.{0,3}a)b」が「aba」にマッチしません。

 これも同様にバグってました。これまた修正させていただきます。

> コードポイントがU+10000以上である文字が、
> サロゲートペア二文字で表されるため、
> 文字クラス中で使うと関係ない文字がヒットしたり、
> 括弧なしで繰り返し指定ができないなど使いにくいです。

 現状では文字クラスの中でのユニコード文字指定について、サロゲートペアへ
の対応はまったく配慮してませんでした。

 ということで、うまく動くように対応したいと思いますが、サロゲートペアの
文字をどうやって指定するかという問題があることが分かりました。

 VisualStudioとかでは、\uXXXX\uXXXXみたいな感じで2つの文字コードを並べ
て指定させる物もあるようですが、それだとサロゲートペアに分解した文字コー
ドを計算するのが大変難しいと思います。
 (秀丸エディタでテストするとしたら、一度utf-16で保存したファイルをバイ
ナリモードで開くなどしないと分からないと思います)

 なので、他の正規表現システムを見習って、「\u{XXXXXX}」のように、{}で囲
むことで任意桁数の16進コードを指定出来るようにしたらいいかと思いました。

 これについて何かご意見があれば是非お願いしたいです。

[ ]
RE:06520 hmjre.dllの不具合No.06523
秀まるお さん 11/05/18 09:35
 
 サロゲートペアについての処理をいろいろ直してうまくいくように出来たと思
うのでここでその仕様を書かせていただきます。

 まずは新しい仕様として、サロゲートペアの文字を文字クラスの中で指定する
方法として、

 [\u{nnnnn}]
 [\u{nnnnn}-\u{nnnnn}]

 のように、\uの後に{}で囲んでユニコードの文字コードを16進数で指定出来
るようにします。または、

 [\uXXXX\uXXXX]
 [\uXXXX\uXXXX-\uXXXX\uXXXX]

 のような形てサロゲートペアになってる2つのユニコード文字を書いてやって
も同じ意味と解釈出来るようにします。

 例えばユニコード16進数で25055の文字があるんですが、それは、

 [\u{25055}]

 と指定することも、サーゲートペアにした時の文字コードである

 [\uD854\uDC55]

 と書いても同じと解釈されるようにします。

 [\u{25055}-\u{25056}]

 は、

 [\uD854\uDC55-\uD854\uDC56]

 と書いてもいいことになります。

 それと、もしも

 [\uD854]

 のようにサロゲートペアの先頭半分だけし書かなかった場合、それはサロゲー
トペアの先頭半分が一致する文字の全体(4バイト分すべて)にマッチする動作
にします。以前のバージョンでは先頭半分の2バイトのみにヒットするという中
途半端な処理になってましたが、今回は文字全体にヒットするようにします。

 例えば

 [\uD854]+

 と書いた場合の動作が以前とは違うようになります。

[ ]
RE:06523 hmjre.dllの不具合No.06540
h-tom さん 11/05/22 23:59
 

h-tom です。

仕様の確認です。

> [\uD854]
> のようにサロゲートペアの先頭半分だけし書かなかった場合、それはサロゲー
>トペアの先頭半分が一致する文字の全体(4バイト分すべて)にマッチする動作
この仕様ですが、
 [\u{D854}]
と、記述した場合も、
 [\uD854]
と同じ結果になりますが、これは仕様ですか?

[\u{D854}] の形式で指定するのは、「文字コード」だと思っていたので、マッチ
するとは思いませんでした。

[ ]
RE:06540 hmjre.dllの不具合No.06542
秀まるお さん 11/05/23 10:06
 
 \u{....} は、ヘルプでは「サロゲートペアとなるユニコード文字の指定」と
書いてしまいましたけども、実際の作り的にはサロゲートペア専用ではなくて、
単純に\uXXXXのXXXX部分が任意の桁数指定出来るようにしただけの作りにしてし
まいました。なので、

 [\uD854]

 と

 [\u{D854}]

 はまったく同じ扱いになります。

 \u{...}を使ってサロゲートペアの1ワード目だけを指定するような使い方を
あえてする人はいないんじゃないかと思いますが、あえてそういう指定をする人
がいるとしたら、それはつまりサロゲートペア1ワード目がそれにヒットして欲
しいという意味と解釈ても別にいいような気がします。

 あるいはヘルプの方直した方がいいようでしたら直してもいいですけども。
(サロゲートペア専用という訳ではありませんみたいな感じで)

[ ]