正規表現の前方一致指定についてNo.37266
fzok4234 さん 19/04/07 07:20
 
ファイルタイプ別の設定の強調表示で、正規表現の前方一致指定を使っての強調表示
がうまくできません。

例えば、以下の行があったとします。

zzz a0b1c2d3e4f5

この行の数字だけ(0〜5)を全て強調表示することを意図して、次のような設定で強調
表示の項目を作りました。

文字列 : (?<=zzz[ \t]+.*)\d+
大文字/小文字の区別 : OFF
単語の検索 : OFF
正規表現 : ON

その結果、強調表示できたのは一番左側の「0」だけでした。前方一致指定の「(?<
=)」の中に書かれている任意の文字列を表す「.*」にマッチするのが最も短い文字列
だけになってしまいます。

意図したとおりに強調表示させるにはどうしたらよいのでしょうか。



[ ]
RE:37266 正規表現の前方一致指定についてNo.37267
Iranoan さん 19/04/07 17:15
 
fzok4234さん今日は、Iranoan です
> 文字列 : (?<=zzz[ \t]+.*)\d+
<snip>
> その結果、強調表示できたのは一番左側の「0」だけでした。前方一致指定の「(?<
>=)」の中に書かれている任意の文字列を表す「.*」にマッチするのが最も短い文字
>列だけになってしまいます。
秀丸の正規表現は基本最長一致ですからこの様な動きになります
(?<=zzz[ \t]+[^0-9]*)\d+
と数字以外の指定にするか
(?<=zzz[ \t]+.*?)\d+
と最短一致を使えば良いでしょう

[ ]
RE:37267 正規表現の前方一致指定についてNo.37268
fzok4234 さん 19/04/07 22:23
 
回答ありがとうございます。

>秀丸の正規表現は基本最長一致ですからこの様な動きになります
>(?<=zzz[ \t]+[^0-9]*)\d+
>と数字以外の指定にするか
>(?<=zzz[ \t]+.*?)\d+
>と最短一致を使えば良いでしょう

試してみましたが、うまくいきませんでした。
現在、とある形式のファイルを似たような正規表現で特定の記号を強調表示させよう
としていますが、前方一致指定以外の方法が思いつかず困っています。


[ ]
RE:37268 正規表現の前方一致指定についてNo.37269
colder さん 19/04/07 23:53
 
colderです。
これはhmjre.dllの制限です。
https://help.maruo.co.jp/hmjre/html/0003_ABOUT_REGULAR.html#frontmatchより
>ただし、秀丸エディタの強調表示の中ではこれ(検索開始位置のバックトラック)
>が効かないようにあえてやってるので、場合によっては期待した動作にならないこ
>とがありえます。

正規表現dllを変更してもいいなら何とかなります。
NetRegex.dllならfzok4234さんが示された正規表現で強調できますし、
hmonig.dllなら「(zzz[ \t]|(?<!^)\G)[^0-9]*(\d+)(?\2)」もしくは
「(zzz[ \t]|(?<!^)\G).*?(\d+)(?\2)」で強調できます。

[ ]
RE:37269 正規表現の前方一致指定についてNo.37270
colder さん 19/04/08 00:28
 
追加、
hmonig.dllなら「(zzz[ \t]|(?<!^)\G)[^0-9]*\K\d+」もしくは
「(zzz[ \t]|(?<!^)\G).*?\K\d+」でもいいです

[ ]
RE:37270 正規表現の前方一致指定についてNo.37272
秀丸担当 さん 19/04/08 12:11
 

強調表示はcolderさんの言われる通り、前方一致での制限がありました。制限を無く
す方法は正規表現DLLを変える以外には無いと思いいます。
これを解除すると都合が悪い場合があってそうなっていますが、任意で解除する方法
があったらいいと思います。
例えばHmJre独自の指定で(?#similar:数値)というものがありますが、このような(?#
コメント)の特定の指定で解除できるとか、何らかの方法を今後のバージョンで検討
したいと思います。

あと、検索ダイアログからの下検索で、本文に折り返しがあるとき、折り返しを2行
以上遡っての前方一致もできていない問題もあることがわかり、こちらはV8.89の次
のβ版で修正させていただきます。

[ ]
RE:37272 正規表現の前方一致指定についてNo.37273
fzok4234 さん 19/04/08 14:23
 
やはり意図的な機能制限だったのですね。

>これを解除すると都合が悪い場合があってそうなっていますが

制限を解除すると具体的にどのような問題が起きるのか教えてもらえればありがたい
です。今後のバージョンアップで制限解除のオプションが実装されたとき、当方の環
境でこれを使っても問題ないかを考える指標とさせていただきます。


[ ]
RE:37273 正規表現の前方一致指定についてNo.37274
秀丸担当 さん 19/04/08 16:04
 

制限を無くすと、1行が非常に長くて、しかも1行の中で複数文字列にヒットする
ケースで極端に遅くなる可能性が出てきます。(?<=...)の中に例えば「.*」とかの繰
り返しパターンが入ってくると極端に遅くなる可能性が出てきます。
強調表示の場合は画面の中に入ったり描画しなおしたりのタイミングで再度計算する
ことがあります。
制限の解除は(?#lookbehind)というようなコメントを付ける方式で次のβ版で対応し
ようと思います。

[ ]