正規表現における論理和後の前方不一致No.32917
MAIKU さん 14/02/07 11:50
 
下記の正規表現で検索を実行するとエラーが表示されます。


正規表現:順序|(?<!手)順|(?<!実)行動

エラーメッセージ:
正規表現での(?<!..)の指定が先頭じゃない所にあります。

前方不一致は先頭にないとエラーがでるようなのですが
前方不一致を指定した表現の論理和で検索したい場合が多々あります。
良い方法があればご教示頂けると幸いです。


使用環境は下記になります。

秀丸:ver.8.33
正規表現:HMJRE.DLL V4.05

[ ]
RE:32917 正規表現における論理和後の前方No.32918
秀まるお2 さん 14/02/07 13:32
 
 前方不一致指定が正規表現の先頭でないとダメな仕様は、すみませんが簡単に
は直せないです。なので、正規表現パターンを工夫してなんとか回避していただ
くしか無いです。

 ちょっと不正確でもよければ、とりあえず、

    (?<!手|実)(順序|順|行動)

 ってパターンがあるかなぁと思いました。

 正確にやるとしたら、例えば

    順序|([^手]|^)順)|([^実]|^)行動

 ってパターンがあるかと思います。これで一応、ヒットする場所は分かると思
いますが、例えば「順」にヒットさせたくても、その前の文字も含めてヒットし
てしまいます。

 それ以上はいいアイデアは思い浮かばないです。

 誰か正規表現に詳しい人、いいアイデアは無いでしょうか。

 それか…。

 今ちょっと試してみたら、鬼車さんは前方不一致指定を任意の場所で指定でき
るようなので、それを使っていただく作戦もありかなぁと思います。

    http://homepage3.nifty.com/_htom/macro/hmonig.html

 あと、BRegIf.DLLでもできました。

    http://www.arimac.com/BRegIf/index.html

 HmJre.dllの方もなんとか対応しないといけなさそうな気がしますが、レベル
ダウンが怖いし…。なかなか難しいです。

[ ]
RE:32918 正規表現における論理和後の前方No.32919
秀まるお2 さん 14/02/07 13:43
 
 ちょっと間違えました。

>     順序|([^手]|^)順)|([^実]|^)行動

  順序|([^手]|^)順|([^実]|^)行動

 の間違いでした。

[ ]
RE:32918 正規表現における論理和後の前方No.32920
秀まるお2 さん 14/02/07 13:49
 
 ちなみに鬼車さんやBregExpさんでは、前方一致/前方不一致指定が任意の場所
で指定できつつも、その代わり、「.*」みたいな繰り返しパターンはそこに入れ
ることが出来ないって制限があるようです。

    (?<!a|bb|cc)xyz
    (?<!a|b{2}|c{3})xyz

 とかは大丈夫ですが、

    (?<!a+)xyz
    (?<!a{3,5})xyz

 だとダメみたいです。

 HmJre.dllの場合でも、そういう制限を付けることで、任意の場所で前方一致/
前方不一致を指定できるように直せそうな気がします。(前方に指定した場合に
限っては繰り返しパターンをOKにするということで)

 時間を見て考えてみます。

[ ]
RE:32920 正規表現における論理和後の前方No.32922
MAIKU さん 14/02/07 14:31
 
ありがとうございます。

.*や.{0,3}は良く使いますので、
下記がよさそうです。

 順序|([^手]|^)順|([^実]|^)行動

試してみると下記例のように、
確かに前の文字が認識されてしまいます。

 「その順序」だと「順序」ではなく
 「の順」がマークされてしまう

ただ、マークできないよりは格段に良いので、
この方法で解決したいと思います。


ありがとうございました。

[ ]
RE:32918 正規表現における論理和後の前方No.32923
colder さん 14/02/07 15:36
 
colderです

できました。
(?<=(?!手順|実行動)(^|.))(順|行動|順序)
ただ前方不一致に文字数が異なるパターンがある場合には対応出来ないです
バグも見つけてしまいました。
(?<=(?!手順)(^|.))順|行動
が順の前のある一文字にヒットしてしまいます。

[ ]
RE:32923 正規表現における論理和後の前方No.32925
秀まるお2 さん 14/02/07 17:56
 
> (?<=(?!手順)(^|.))順|行動
> が順の前のある一文字にヒットしてしまいます。

 これは、実は内部的には

 ((?<=(?!手順)(^|.))順)|(行動)

 のような解釈になってしまってて、これはつまりエラー扱いしないといけない
ケースになるようです。

 エラー扱いしないまま通った場合は、(?<=...)は普通の()と同じ処理が実行さ
れて、結果として間違った所にヒットするようです。

 とりあえずエラー扱いするように修正させていただきます。

 あと、(?<=...)と(?<!...)を正規表現の先頭以外で使えるようにするのも、一
応、現状ではそういうのはすべてエラー扱いしてるだけということは、注意深く
修正すればレベルダウンのバグが出ることは無さそうです。なので、ぼちぼち
トライしてみます。

[ ]
RE:32925 正規表現における論理和後の前方No.32931
秀まるお2 さん 14/02/11 15:32
 
 今さらですが、前方一致/前方不一致指定を正規表現パターンの先頭以外の場
所に指定してもうまくいくように直しました。

 前方一致/前方不一致指定の中に繰り返しパターンが無ければ通るようにしま
した。繰り返しパターンがある場合(で、先頭じゃない場合)はエラーになりま
す。

 一応、以前の処理をいじらずに追加的に機能追加したので、この機能を使わな
い限りはレベルダウンは無いと思います。

 次の秀丸エディタβ版に添付してもらうことにします。

[ ]