強調表示の正規表現(前方不一致指定)にNo.18878
どみにか さん 05/02/22 14:12
 
はじめまして。どみにかと申します。
よろしくお願いいたします。

括弧を強調表示(特に強調1)する際に、
コメント行や、文字列定数内を強調対象外とするために、
以下の正規表現で強調定義しています。

 正規表現文字列:(?<!('.*|"[^"]*"))*(\(|\)|\{|\}|\[|\]|「|」|「|」)

ところが、以下のような文字列の場合に、
思うような強調表示がされません。

 文字列(例:VBです):MsgBox Format(p1, "yyyy/mm/dd")

 希望:「"yyyy/mm/dd"」を文字列定数として強調し、
    括弧「"("」と「")"」を特に強調1として強調
 現状:括弧「"("」と、「"yyyy/mm/dd")」が青で強調されてしまう

文字列定数より、特に強調の方が優先順位が高いため、
前方不一致で対象外にしているつもりなのですが、
いろいろ試してもうまくいきません。

ダブルクォーテーションと、閉じ括弧の間に、
半角スペース等が入ると、希望通りの強調がされるので、
もうちょっとだと思うのですが・・・。

うまく伝わりますでしょうか・・・
あきらめて妥協する前に、
一度皆様にお尋ねしてみようかと思いまして投稿した次第です。
どなたかご教示願います。

環境
 ・秀丸 v4.14
 ・HmJre.dll v1.12
 ・OS WinXP Pro(Sp1)


[ ]
RE:18878 強調表示の正規表現(前方不一致No.18879
アルビレオ さん 05/02/22 21:14
 
秀丸ユーザーのアルビレオです。

> 正規表現文字列:(?<!('.*|"[^"]*"))*

この「前方不一致の繰り返し」というのが解釈として微妙で、現におかしな動作
をしているようです。
(こういう指定は正規表現エラー扱いした方がいいような気もします)

あまり多くのパターンでのテストはしていませんが、「*」の位置を変えて
(?<!('.*|"[^"]*")*)
とすると、例としてあげられている文字列ではうまく()のみにヒットしました。

細かいことを言えば
(?<!('.*|("[^"]*")*))
とした方が文法解釈としては正確だし、速度的にも有利かもしれません。

[ ]
RE:18878 強調表示の正規表現(前方不一致No.18880
秀まるお2 さん 05/02/22 21:24
 
 「(」だけを強調する例としてですが、例えば、

 (?<=(^[^"\(']*)|(^[^"\(]*\"[^"]*\"[^"\(]*))\(

 って書くとかなりいいです。この場合、

 "aaa"   "bbb"  (  )

 みたいに「(」の前に文字列が2つ以上ある場合はダメですけど。しいてそれ
もOKにするなら、

 (?<=(^[^"\(']*)|(^[^"\(]*\"[^"]*\"[^"\(]*)|(^[^"\(]*\"[^"]*\"[^"\(]*\"
[^"]*\"[^"\(]*))\(

 っと長くなります。

 「(」と「)」の両方なら、上記のパターンとは別に、

 (?<=(^[^"\)']*)|(^[^"\)]*\"[^"]*\"[^"\)]*))\)

 のような強調表示を書くのがいいと思います。

 どっちにしてもかなり無理して書いてるので、画面の描画がだいぶ遅くなるか
もしれません。

[ ]
RE:18880 強調表示の正規表現(前方不一致No.18883
どみにか さん 05/02/23 01:03
 
アルビレオさん、秀まるお2さん、
回答ありがとうございます。

さっそく試してみました。
結果として、残念ながら希望通りにはいかなかったです。

アルビレオさんに教えていただいた正規表現では、
どういうわけか括弧がヒットしませんでした。
他の強調表示が邪魔しているのかもと思い、調べてはみたのですが、
それらしき不一致指定は見見つけきれませんでした。
DLLが古いわけではないですし・・・なぜでしょうか??

秀まるお2さんご教示の方法ですと、
括弧の入れ子の場合に「(」と「)」それぞれ、行の一番左のものしかヒットしません
でした。
じつは最初の頃に、いくらやっても一番左のものしかヒットせず、
ヘルプを見つつあれこれ考えながらたどり着いたのが、
最初に提示させていただいた正規表現だったのです。
私の場合はもっと稚拙でお粗末な正規表現でしたけども・・・(^_^;

曖昧で強引な上に、描画速度にも影響するとのことですし、
あきらめが肝心かもですよね。(描画速度なんて考えたこともなかったです(恥))
機能的ではなく視覚的に、
しかも、必要なわけではなく、もはやこだわりの領域ですので、
ここはサクッとあきらめて妥協案を考えてみたいと思います。

ありがとうございました。
大変勉強になりました。
今後ともよろしくお願いいたします。

[ ]
RE:18883 強調表示の正規表現(前方不一致No.18884
アルビレオ さん 05/02/23 02:08
 
アルビレオです。

>アルビレオさん、秀まるお2さん、
>回答ありがとうございます。
>
>さっそく試してみました。
>結果として、残念ながら希望通りにはいかなかったです。
>
>アルビレオさんに教えていただいた正規表現では、
>どういうわけか括弧がヒットしませんでした。
>他の強調表示が邪魔しているのかもと思い、調べてはみたのですが、
>それらしき不一致指定は見見つけきれませんでした。
>DLLが古いわけではないですし・・・なぜでしょうか??

あ、私が書いたのは前方不一致の部分だけです。
その後ろが長いので元の検索文字列からコピーしてくるか、文章で注意しようか
迷っていたら、そのどちらもしないままになっていました(^^;

(?<!('.*|"[^"]*")*)(\(|\)|\{|\}|\[|\]|「|」)

ですね。

[ ]
RE:18884 強調表示の正規表現(前方不一致No.18887
どみにか さん 05/02/23 11:22
 
お世話になってます。どみにかです。


>あ、私が書いたのは前方不一致の部分だけです。
>その後ろが長いので元の検索文字列からコピーしてくるか、文章で注意しようか
>迷っていたら、そのどちらもしないままになっていました(^^;
>
>(?<!('.*|"[^"]*")*)(\(|\)|\{|\}|\[|\]|「|」)
>
>ですね。

いえいえ、ちゃんと後方指定部分も記述しました。
なのに、ヒットしなかったんです。
DLLのバージョンは間違いなく、v1.12です。
タイムスタンプが1秒違ったので、おそらく偶数に繰上げられただけとは思いつつ、
念のため上書きして試してみたのですが、やはり同じでした。
他の強調定義を全て削除してみても、ヒットしてませんでした。
単語指定もしてません。
ちなみにカラー表示モードは、VisualBasicです。

アルビレオさんはヒットして、私はヒットしない。
DLLの動作に何か環境が影響しているのしょうかねぇ・・・?(゚_・)

[ ]
RE:18887 強調表示の正規表現(前方不一致No.18890
アルビレオ さん 05/02/23 14:30
 
アルビレオです。

>いえいえ、ちゃんと後方指定部分も記述しました。
>なのに、ヒットしなかったんです。

私のうっかりミスでした…
まだ検索履歴に残っていたので確認したところ
(?<=('.*|"[^"]*")*)(\(|\)|\{|\}|\[|\]|「|」)
となっていました。
前方不一致じゃなくて前方一致ですね。

[ ]