強調表示に関してNo.07764
EXZS さん 01/03/03 23:35
 

秀丸3.08にて強調表示で少しおかしいところがあります。

英数字大文字のラベルを強調しようとして

[_0-9A-Z]*

で強調2を登録するのですが、強調表示されません。
どうもキャラクタクラスが先頭にある*では表示できない
ようで

[_A-Z][_0-9A-Z]*

なら強調表示するようです。

少し気になるので調査願います。

[ ]
RE:07764 強調表示に関してNo.07765
TAKA さん 01/03/04 00:26
 
TAKA です。

>[_0-9A-Z]*
>
>で強調2を登録するのですが、強調表示されません。
>どうもキャラクタクラスが先頭にある*では表示できない
>ようで

「キャラクタクラスが先頭にある*では表示できない」の意味がよ
く分かりませんが、

//テストファイル(ここから)
aTEST
TEST
//テストファイル(ここまで)

このような場合は、1行目は強調表示されませんね。

ただ、正規表現に「[_0-9A-Z]*」を指定していますので、「*」は
直前の文字の0回以上ということですので、0回でもよいことにな
り、場合によっては何も指定しないことと一緒になります。
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1行目では最初にaがあるので、検索結果がヌル(文字列として何
もない)になりますので表示されません。(ヌルということで、検
索されなかったと見なされるわけです)

2行目は、「TEST」が検索結果となり、正常に表示されます。

分かりにくいかもしれませんが、結果は指定した通り正常に動作し
ていることになります。

EXZS さんの場合は、正規表現として「[_0-9A-Z]+」として、1回
以上の繰り返しというように指定しないと意図した通りに表示され
ません。

[ ]
RE:07765 強調表示に関してNo.07766
EXZS さん 01/03/04 01:26
 
TAKAさん、どうもです

>>[_0-9A-Z]*
>>
>//テストファイル(ここから)
>aTEST
>TEST
>//テストファイル(ここまで)
>
>このような場合は、1行目は強調表示されませんね。
>
>ただ、正規表現に「[_0-9A-Z]*」を指定していますので、「*」は
>直前の文字の0回以上ということですので、0回でもよいことにな
>り、場合によっては何も指定しないことと一緒になります。
>                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

ってことは空白文字でもヒットしてしまうということですか?
確かにテストしてみましたが、

AAA  ←強調あり
 AAA  ←強調なし

っていうことになりますね。
うう、こういうものなのかな、*による一致方法って(?_?)

>
>1行目では最初にaがあるので、検索結果がヌル(文字列として何
>もない)になりますので表示されません。(ヌルということで、検
>索されなかったと見なされるわけです)
>

ここの件がよくわからないのですが、私がヒットさせたかったのは
aAAAでななくてAAAの方ですからそれがヒットするのを期待して
いたのですが、今の現象を見ると行の先頭から始まっていない
・・・というか行頭に空白が入ってしまっているという点では
aAAAとの差はないのでしょうが・・・
この「検索結果がヌルと判定」というものになってしまう
ロジックがイマイチよくわかりません・・・

>
>EXZS さんの場合は、正規表現として「[_0-9A-Z]+」として、1回
>以上の繰り返しというように指定しないと意図した通りに表示され
>ません。

確かにそうです。
なお、少しまずい事を見つけてしまって
このままだと単なる数字にもヒットしてしまうので
[_A-Z][_0-9A-Z]*
としないといけないようです(汗)


[ ]
RE:07766 強調表示に関してNo.07767
TAKA さん 01/03/04 02:03
 
TAKA です。

>>ただ、正規表現に「[_0-9A-Z]*」を指定していますので、「*」は
>>直前の文字の0回以上ということですので、0回でもよいことにな
>>り、場合によっては何も指定しないことと一緒になります。
>>                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
>ってことは空白文字でもヒットしてしまうということですか?
>確かにテストしてみましたが、
>
>AAA  ←強調あり
> AAA  ←強調なし
>
>っていうことになりますね。
>うう、こういうものなのかな、*による一致方法って(?_?)

空白文字にヒットする訳ではなく、空白文字の前のヌルに引っかか
ります。


>>1行目では最初にaがあるので、検索結果がヌル(文字列として何
>>もない)になりますので表示されません。(ヌルということで、検
>>索されなかったと見なされるわけです)
>>
>
>ここの件がよくわからないのですが、私がヒットさせたかったのは
>aAAAでななくてAAAの方ですからそれがヒットするのを期待して
>いたのですが、今の現象を見ると行の先頭から始まっていない
>・・・というか行頭に空白が入ってしまっているという点では
>aAAAとの差はないのでしょうが・・・
>この「検索結果がヌルと判定」というものになってしまう
>ロジックがイマイチよくわかりません・・・

//テストファイル(ここから)

TEST
aTEST
TEST
//テストファイル(ここまで)

このようなファイルで「検索→検索」で検索文字列に「[_0-9A-Z]*」
を指定して、正規表現をONにして検索をして、「検索→下候補」を
何回か実行すると、「aTEST」の先頭にカーソルが来ますが、通常
の検索では検索された文字列が反転する訳ですが、「aTEST」の先
頭にカーソルがきた時は反転していませんよね。
これがヌルで検索されたということです。
「 AAA」も同様です。

その行を検索した結果の文字列がヌルだったため、秀丸側ではその
行はヒットしなかったという判断になります。

分かって頂けたでしょうか?

これで、分からなければ、私にはお手上げです。
EXZS さんが悪い訳ではなく、私の説明が悪いだけです。

それだけ、正規表現は奥が深いものです。

このような正規表現(場合によってはヌルにもなる)を指定するこ
と自体も考慮して、秀丸側で検索結果がヌルの場合は、その行に対
して再度検索をかけてもらうというように要望することは可能かも。
レスポンスのために、1行の対して検索は1回しかしないという今
の仕様は崩せないかな?(正規表現の結果がヌルになるような指定
は利用者の責任ということで)

どうなんでしょう。 > 秀丸担当さん


>>EXZS さんの場合は、正規表現として「[_0-9A-Z]+」として、1回
>>以上の繰り返しというように指定しないと意図した通りに表示され
>>ません。
>
>確かにそうです。
>なお、少しまずい事を見つけてしまって
>このままだと単なる数字にもヒットしてしまうので
>[_A-Z][_0-9A-Z]*
>としないといけないようです(汗)

今回は、これで解決したようですね。
「[_A-Z]」の部分で文字列として1文字は必要になる訳なので、
ヌルには引っかからずに正常に(意図した通り)動作します。

[ ]
RE:07766 強調表示に関してNo.07768
ひろ さん 01/03/04 03:32
 
 EXZS さん今日は、ひろです。
> >>[_0-9A-Z]*
 おそらくプログラムのサブルーチンや関数などを強調したいのだと思いま
すが、最後の
> [_A-Z][_0-9A-Z]*
という要領で書かれるべきですね。
> ここの件がよくわからないのですが、私がヒットさせたかったのは
> aAAAでななくてAAAの方ですからそれがヒットするのを期待して
 強調表示の場合ですから、単純に「単語の検索」も ON にすれば良いと思
います。

 因みに検索の場合は、「正規表現」と「単語の検索」は同時に ON には出
来ないですが、今回の場合検索文字列を「\<[_A-Z][_0-9A-Z]*\>」とすれば
出来ます。

[ ]
RE:07768 強調表示に関してNo.07770
TAKA さん 01/03/04 04:07
 
TAKA です。

> 因みに検索の場合は、「正規表現」と「単語の検索」は同時に ON には出
>来ないですが、今回の場合検索文字列を「\<[_A-Z][_0-9A-Z]*\>」とすれば
>出来ます。

// テストファイル(ここから)
0TEST
// テストファイル(ここまで)

「0TEST」は検索されませんが、「TEST」では検索されますので、
強調表示で「単語の検索」をONにした場合とまったく同じ結果には
ならないことに注意が必要ですね。

[ ]
RE:07767 強調表示に関してNo.07772
ひろ さん 01/03/04 12:15
 
 TAKA さん今日は、ひろです。横から失礼します。
 安易に「*」を使うことに問題があるとは思いますが、
> このようなファイルで「検索→検索」で検索文字列に「[_0-9A-Z]*」
> を指定して、正規表現をONにして検索をして、「検索→下候補」を
> 何回か実行すると、「aTEST」の先頭にカーソルが来ますが、通常
> の検索では検索された文字列が反転する訳ですが、「aTEST」の先
> 頭にカーソルがきた時は反転していませんよね。
> これがヌルで検索されたということです。
> 「 AAA」も同様です。
この先頭に来た時点では、検索はヒットしませんが、この直後の「下候補」
でどちらの場合も「AAA」にヒットします。<-あくまで通常の検索の話

 そう考えると、強調表示の設定で「単語の検索」ON なら「 AAA」の「AAA」
にはヒット、単語の検索が OFF なら両方にヒットするのが正しい動作のよ
うな気がします。

 ただ秀丸の強調表示は論理行単位に処理をしているとのことなので、「ヌ
ルがヒットした場合、その行全体を強調表示の対象としない」という処理を
しているなら納得がいくのですが、実際のところどういった仕様なのでしょ
う?

 またヌルがヒットするなら 2 バイトコードの場合も、その間でヒットし
ても良いと思う。

[ ]
RE:07770 強調表示に関してNo.07779
ひろ さん 01/03/04 14:56
 
 TAKAさん今日は、ひろです。
> > 因みに検索の場合は、「正規表現」と「単語の検索」は同時に ON には出
> >来ないですが、今回の場合検索文字列を「\<[_A-Z][_0-9A-Z]*\>」とすれば
<中略>
> 「0TEST」は検索されませんが、「TEST」では検索されますので、
 レスの手抜きですね。「動作環境の設定」→「編集」→「高度な編集」
の「単語の検索で"abc"を検索する時、"abc123"にはヒットさせない」を OFF
にすれば、前者もヒットします。

[ ]
RE:07772 強調表示に関してNo.07782
TAKA さん 01/03/04 15:57
 
TAKA です。

> 安易に「*」を使うことに問題があるとは思いますが、

ですね。


>> このようなファイルで「検索→検索」で検索文字列に「[_0-9A-Z]*」
>> を指定して、正規表現をONにして検索をして、「検索→下候補」を
>> 何回か実行すると、「aTEST」の先頭にカーソルが来ますが、通常
>> の検索では検索された文字列が反転する訳ですが、「aTEST」の先
>> 頭にカーソルがきた時は反転していませんよね。
>> これがヌルで検索されたということです。
>> 「 AAA」も同様です。
>この先頭に来た時点では、検索はヒットしませんが、この直後の「下候補」

私は、この先頭に来た時点では、ヌルにヒットしたと思っています。
「検索→下候補」でカーソルが移動した先は、ヒットしたところだ
という認識がありました。


> またヌルがヒットするなら 2 バイトコードの場合も、その間でヒットし
>ても良いと思う。

// テストファイル(ここから)

テスト
// テストファイル(ここまで)

ひろ さんの言われる通り、このようなファイルでは「テスト」と
いう文字の先頭や文字の間にヒットしませんね。

ヌルにヒットというのは違っているかもしれません。
違っているとしたら、

// テストファイル(ここから)

aTEST
// テストファイル(ここまで)

で、「a」の前でヒットするのが謎ですね。


ひろ さんの言われる通り、どういう仕様なのか私も知りたいです。


念のために私の知りたいことを整理しておきます。
正規表現において「[A-Z]*」を検索した場合に謎な現象があります。
「*」は0回以上の検索なので0回というのも検索に引っかかる
(ヌルになる場合がある)ので、そのようなものは動作の保障がさ
れないというのであれば、それでも良いのですが、もし動作の保障
                                              ^^^^^^^^^^^^^^
がされるのであれば、以下のような時に謎です。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

// テストファイル(ここから)

testTEST
テスト
// テストファイル(ここまで)

このような場合には、私としてはヌルにもヒットすると思っている
ので、ヌルにヒットする場所として、「t」の前、「t」と「e」の
間、「e」と「s」の間、「s」と「t」の間、「T」と改行の間、
「テ」の前、「テ」と「ス」の間、「ス」と「ト」の間、「ト」
と改行の間にヒットすると思うのですが、ひろさんの言われる通り
全角ではヌルにヒットしませんでした。
何故でしょうか?

「検索→検索」で検索文字列に「[A-Z]*」を指定して、正規表現を
ONにして検索をして、「検索→下候補」を何回か実行して確認しま
した。

ヌルにはヒットしないというのであれば、上記の場所にカーソルが
移動すること自体がおかしいと思うのですが。(カーソルが移動し
たということはヒットしたということだと思っているので)

私はヌルにはヒットして、全角ではヌルにヒットしないのが不具合
であると思っています。
動作の保障がされるという前提です。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


次に、「その他→ファイルタイプ別の設定→強調表示」で文字列に
「[A-Z]*」を指定、正規表現をON、強調1を選択した場合、

// テストファイル(ここから)
 TEST
TEST
// テストファイル(ここまで)

2行目しか表示されません。
これは、強調表示の仕様として、エディタ行に対して1回だけ検索
を行いヒットした場合は、その部分を表示するために1行目はヌル
にヒットしたため、秀丸側ではヌルの場合は何もしない仕様にして
いるのだと思います。
最初は、ヌルの部分を表示はしているが、ヌルなので目に見えてい
ないのかなとも思いましたが、「強調1」から「行の強調1」に換え
ても1行目は強調表示されませんでしたので、ヌルであれば何もし
ない仕様だと判断しました。


そういう訳でよろしくお願いします。 > 秀丸担当さん

[ ]
RE:07782 強調表示に関してNo.07800
EXZS さん 01/03/04 23:22
 
TAKAさん、ひろさん、レスどうもです。

場所的にここにレスをつけさせていただきます。

>TAKA です。
>
>> 安易に「*」を使うことに問題があるとは思いますが、
>
>ですね。
>

確かに・・・

>次に、「その他→ファイルタイプ別の設定→強調表示」で文字列に
>「[A-Z]*」を指定、正規表現をON、強調1を選択した場合、
>
>// テストファイル(ここから)
> TEST
>TEST
>// テストファイル(ここまで)
>
>2行目しか表示されません。
>これは、強調表示の仕様として、エディタ行に対して1回だけ検索
>を行いヒットした場合は、その部分を表示するために1行目はヌル
>にヒットしたため、秀丸側ではヌルの場合は何もしない仕様にして
>いるのだと思います。
>最初は、ヌルの部分を表示はしているが、ヌルなので目に見えてい
>ないのかなとも思いましたが、「強調1」から「行の強調1」に換え
>ても1行目は強調表示されませんでしたので、ヌルであれば何もし
>ない仕様だと判断しました。
>
>
>そういう訳でよろしくお願いします。 > 秀丸担当さん

なんとなく理解しました。
あの書き方だと行の先頭で探し始めたら「[_0-9A-Z]が一つも
続かない」にヒットしてしまったという事ですね?
んで、秀丸では(というか正規表現としてこれが正しい解釈
なのかわからないのですが、少なくとも秀丸では)そこで
ヒットしたとして終わってしまうという。
というかヒットしてもヌル(つまりカーソルが移動してなければ)
終了してしまうのか〜



[ ]
RE:07800 強調表示に関してNo.07802
Arimac さん 01/03/05 01:22
 
JRE32.DLL を直接呼び出して確かめたところ
"aABC" を "[A-Z]*" で検索すると
nPosition = 0 (マッチ位置)
nLength = 0 (マッチした長さ)
となりました。

継続して検索する場合は通常
nStart = nPosition + nLength (検索開始位置)
とすると思いますが、
この場合はループしてしまう事になります。

マッチした長さが0の場合だけ特別扱いして
1文字だけ進めるようにする方が良いと
思います。

[ ]
RE:07802 強調表示に関してNo.07803
TAKA さん 01/03/05 01:47
 
TAKA です。

>継続して検索する場合は通常
>nStart = nPosition + nLength (検索開始位置)
>とすると思いますが、

いえ、違います。
少なくとも秀丸では。


>マッチした長さが0の場合だけ特別扱いして
>1文字だけ進めるようにする方が良いと
>思います。

どのような場合でも、この仕様です。
少なくとも秀丸では。

//テストファイル(ここから)
AAAAAAA
//テストファイル(ここまで)

このテストファイルに対して「検索→検索」で検索文字列に「AA」
を指定して検索をして、「検索→下候補」を何回か実行すると分か
ります。
検索は2文字ごとに進まずに、1文字ごとに進みます。

[ ]
RE:07803 強調表示に関してNo.07805
Arimac さん 01/03/05 08:58
 
>>継続して検索する場合は通常
>>nStart = nPosition + nLength (検索開始位置)
>>とすると思いますが、
>
>いえ、違います。
>少なくとも秀丸では。

強調表示の場合の検索と
手動の検索と
置換時の検索と
grep時の検索では
みんな少しづつ違います。

強調表示の場合は上記のように
する筈です。

[ ]
RE:07803 強調表示に関してNo.07806
Arimac さん 01/03/05 09:03
 
>>継続して検索する場合は通常
>>nStart = nPosition + nLength (検索開始位置)
>>とすると思いますが、
>
>いえ、違います。
>少なくとも秀丸では。

//テストファイル(ここから)
AAAAAAA
//テストファイル(ここまで)


AAA
で強調表示してみましょう。
前のAAAAAAは強調されますが、
最後のAは強調されません。

[ ]
RE:07806 強調表示に関してNo.07808
TAKA さん 01/03/05 10:34
 
TAKA です。

>>>継続して検索する場合は通常
>>>nStart = nPosition + nLength (検索開始位置)
>>>とすると思いますが、
>>
>>いえ、違います。
>>少なくとも秀丸では。
>
>//テストファイル(ここから)
>AAAAAAA
>//テストファイル(ここまで)
>
>を
>AAA
>で強調表示してみましょう。
>前のAAAAAAは強調されますが、
>最後のAは強調されません。

「継続して検索する場合は通常」とあったので、通常の検索のこと
と勘違いしてしまいました。
Arimacさんが言いたかったのは、強調表示のことだったので
すね。大変失礼しました。
強調表示の話題なんだから気が付けよ > 自分


Arimacさんが言いたかったのは、「7767」の発言の

>このような正規表現(場合によってはヌルにもなる)を指定するこ
>と自体も考慮して、秀丸側で検索結果がヌルの場合は、その行に対
>して再度検索をかけてもらうというように要望することは可能かも。
>レスポンスのために、1行の対して検索は1回しかしないという今
>の仕様は崩せないかな?(正規表現の結果がヌルになるような指定
>は利用者の責任ということで)

と同じようなことだと分かりました。
ここで言う「1行の対して検索は1回」とは、何もなかった(ヌル)
場合は1回だけということです。

後は、「7782」に対して、秀丸担当さんからのコメント待ちになり
そうですね。

[ ]
RE:07808 強調表示に関してNo.07845
秀丸担当 さん 01/03/06 18:22
 
この件は、Arimacさんのお察しの通り、マッチした長さ(nLength)
が0のときだけ例外的に対象外とするように処理されています。

>マッチした長さが0の場合だけ特別扱いして
>1文字だけ進めるようにする方が良いと
>思います。

こうすることでより良くなるかもしれないので、検討しておきます。

[ ]
RE:07845 強調表示に関してNo.07850
TAKA さん 01/03/06 18:41
 
TAKA です。

>この件は、Arimacさんのお察しの通り、マッチした長さ(nLength)
>が0のときだけ例外的に対象外とするように処理されています。

「7782」の

>// テストファイル(ここから)
>
>testTEST
>テスト
>// テストファイル(ここまで)
>
>このような場合には、私としてはヌルにもヒットすると思っている
>ので、ヌルにヒットする場所として、「t」の前、「t」と「e」の
>間、「e」と「s」の間、「s」と「t」の間、「T」と改行の間、
>「テ」の前、「テ」と「ス」の間、「ス」と「ト」の間、「ト」
>と改行の間にヒットすると思うのですが、ひろさんの言われる通り
>全角ではヌルにヒットしませんでした。
>何故でしょうか?

と書いたのですが、
半角と全角で動作が違うのは、何が原因だったのでしょうか?
少し気になるので、よければ教えて下さい。

[ ]
RE:07850 強調表示に関してNo.07905
秀丸担当 さん 01/03/08 18:55
 
>と書いたのですが、
>半角と全角で動作が違うのは、何が原因だったのでしょうか?
>少し気になるので、よければ教えて下さい。

たぶんJRE32.DLLはバイトではなく文字として考えているので
全角の間はヒットしないと思います。
たとえヒットしても秀丸がもともと全角の間にはカーソルが
行かないようになっています。

[ ]
RE:07905 強調表示に関してNo.07921
Arimac さん 01/03/08 22:09
 
Version 3.08β2ですが、
「テスト」

「[A-Z]*」
で検索すると下検索だと
文字と文字の間に止まりますが、
上検索だと全然止まりません。

JRE32.DLLがどう呼ばれているか
調べてみると
Jre2GetMatchInfo:lpjreJre = 0x0046E470, nStart = 0, lpszStr = (テスト@0A)
Ret = 1, nPosition = 0, nLength = 0, msg = ()
Jre2GetMatchInfo:lpjreJre = 0x0046E470, nStart = 1, lpszStr = (テスト@0A)
Ret = 1, nPosition = 1, nLength = 0, msg = ()
Jre2GetMatchInfo:lpjreJre = 0x0046E470, nStart = 2, lpszStr = (テスト@0A)
Ret = 1, nPosition = 2, nLength = 0, msg = ()
Jre2GetMatchInfo:lpjreJre = 0x0046E470, nStart = 3, lpszStr = (テスト@0A)
Ret = 1, nPosition = 3, nLength = 1, msg = ()
Jre2GetMatchInfo:lpjreJre = 0x0046E470, nStart = 4, lpszStr = (テスト@0A)
Ret = 1, nPosition = 4, nLength = 0, msg = ()
という感じでマッチ長が0だと
1文字ではなく1バイトづつ進めているような
感じです。
下検索の場合は1文字づつ進めてました。

[ ]
RE:07921 強調表示に関してNo.07942
秀丸担当 さん 01/03/09 18:42
 
>「テスト」
>を
>「[A-Z]*」
>で検索すると下検索だと
>文字と文字の間に止まりますが、
>上検索だと全然止まりません。

これは、どういうことでしょうか。
単に正規表現の検索?
テストのあとに改行があるとき、テストは全て通過して
改行に止まりました。
V3.08です。

[ ]
RE:07942 強調表示に関してNo.07950
Arimac さん 01/03/10 01:37
 
どうも申し訳ありませんm(_ _)m
動作を調べるのに自作のBregIfの方を
使ってました。

オリジナルのJRE32.DLLだと
「01234」

「[A-Z]*」
で検索すると行頭と文字の間と改行の前で
止まりましたが、
「テスト」
だと
改行の前でしか止まりませんでした。

ということで漢字の途中に止まらないのは
JRE32.DLLの不具合のようです。

ただ、この不具合が修正されたとしても
上検索だと7921で書いたように
秀丸エディタ側にも奇妙な現象が発生すると
思われます。

[ ]
RE:07950 強調表示に関してNo.07959
秀丸担当 さん 01/03/12 18:49
 
>どうも申し訳ありませんm(_ _)m
>動作を調べるのに自作のBregIfの方を
>使ってました。

なるほど、そういうことでしたか。

>ただ、この不具合が修正されたとしても
>上検索だと7921で書いたように
>秀丸エディタ側にも奇妙な現象が発生すると
>思われます。

一概にJRE32.DLLの不具合と言えないような気もしますが、
秀丸の動作も全角の間に来てしまうことがありうるという
ことですね。
参考にさせていただきます。

[ ]