HmJre.dll:前方一致/不一致の組み合わせNo.06209
Iranoan さん 05/03/01 15:19
 
 秀丸担当さん今日は、Iranoan です。
 秀まるおさんに、C/C++ の数値表記のリテラルを強調表示方法で、
>     (?<!(0x|[0-9]))([0-9]+)([ulf])(?\3)
>
>  となるようです(手元のHmJre V1.5だと)。
>
>  (?\3)は(?\2)になるべきかもしれませんが…。
と教えて頂いたのですが、
http://www.maruo.co.jp/turukame/1/x11639_.html#11649
上手く動作しません。秀丸本体か、HmJre.dll どちらの問題か不明なので、こ
ちらに投稿します。因みに「(?<!(0x))([0-9\.]+)([ulf])(?\3)」も駄目でし
た。

[ ]
RE:06209 HmJre.dll:前方一致/不一致の組No.06219
秀まるお さん 05/03/01 17:33
 
 すみません。バグってました。今すぐ直します。

[ ]
RE:06219 HmJre.dll:前方一致/不一致の組No.06220
秀まるお さん 05/03/01 17:42
 
 バグが直った次バージョンにて、

       (?<!(0x|[0-9]))([0-9]+)([ulf])(?\2)

 で検索するとうまくヒットします。

[ ]
RE:06220 HmJre.dll:前方一致/不一致の組No.06222
Iranoan さん 05/03/01 17:56
 
 秀まるおさん今日は、Iranoan です。
>  バグが直った次バージョンにて、
>
>        (?<!(0x|[0-9]))([0-9]+)([ulf])(?\2)
>
>  で検索するとうまくヒットします。
 HmJre.dll の問題だったんですね。
 早速の修正有り難うございました。

[ ]
RE:06220 HmJre.dll:前方一致/不一致の組No.07582
Iranoan さん 05/04/25 20:56
 
 秀まるおさん今日は、Iranoan です。
>        (?<!(0x|[0-9]))([0-9]+)([ulf])(?\2)
 これで上手く動作しているのですが、質問があります。
>  pattern1 \f pattern2 \f pattern3 \f ...
>
>  とやる代わりに、
>
>  (pattern1)(pattern2)(pattern3)
>
>  ってな具合になります。例えば、
>
>  ([a-z])([0-9])
>
>  とやると、\1は[a-z]にヒットした部分、\2は[0-9]にヒットした部分って意味
> になります。こっちの新形式の場合は、この\1, \2がそのまま検索対象にも使え
> ることが非常に有益でして、つまり、
>
>  ([a-z])\1\1
>
>  とすると、a-zの同じ文字が3回連続した場合みたいな表現が可能になります。
ということで、(→http://www.maruo.co.jp/turukame/3/x06178_.html#6183)
「()」を使ったときは、各々の pattern を参照するときは \0 ではなく、\1
から始まるんですよね。
 ##Perl も $1, \1 で始まるようなので、これはこれで良いと思います。

 だとすると、
>        (?<!(0x|[0-9]))([0-9]+)([ulf])(?\2)
において、考え方として
・(?<!(0x|[0-9]))([0-9]+)([ulf])(?\3)
   ~~~~~~\1~~~~~  ^^\2^^  ~~\3~
・(?<!(0x|[0-9]))([0-9]+)([ulf])(?\2)
                  ^^\1^^  ~~\2~
があり、後者になっているのは、前方不一致を使い検索にヒットする (範囲選
択や点滅表示される) 部分が元々ない為、と解釈すればよいのでしょうか?
 ##他のソフトウェアでどういった師弟を採用しているか不明ですが...。

 P.S 前者にして欲しいというわけではなく、
・当初単純に一番外側の「()」で括られた部分を単純に数えていけば良いと
  思っていた
・もし Perl や他のソフトウェアと異なっていると良くないと思う
ので、質問させて頂きました。

[ ]
RE:07582 HmJre.dll:前方一致/不一致の組No.07586
M.D.S.-Toy さん 05/04/25 23:40
 
Toyです。

perl の正規表現においては、"(?" でグループ化されているものは一致であろうが不
一致であろうが後方参照用の記録がされないです。
そんなわけで、単純に "(" を数えればいいというわけではありません。

また、単に "()" でグループ化されているものはすべて記録されますので

>>        (?<!(0x|[0-9]))([0-9]+)([ulf])(?\2)

この場合、"([ulf])" に当たるのは \2 でなくて \3 でよかったのではないでしょう
か?
つまり、"(0x|[0-9])" の部分は「除外されない」はずです。(<この部分が \1 に
なります。)

というわけで、Iranoanさんの解釈も、HmJreの現行仕様も
少なくとも perl の正規表現とは仕様が異なるということになります。


↓参考
http://www.rfs.jp/sitebuilder/perl/02/09.html#拡張構文の一覧


# perl は本職ではないので、間違っていたらすいません・・・。フォロー求む。

[ ]
RE:07586 HmJre.dll:前方一致/不一致の組No.07598
秀まるお さん 05/04/26 11:33
 
 Perlでどうかまではよく分かってないんてすけど、前方一致/後方一致/前方
不一致/後方不一致についてはタグ付き正規表現のカッコカウントの対象から外
れる仕様になっていて、その仕様はそのままにしたいです。

 内部的にその方が都合がいいというのがありますので。

 ヘルプの方は修正します。

 実はもっとややこしい例として、

 (a-z])+

 とかって例があったりして、それはどこがタグなんだって話もあるんですが…。
こういうのは解釈がややこしくなるので、

 ((a-z)+)

 と書いて欲しいです。

[ ]
RE:07598 HmJre.dll:前方一致/不一致の組No.07599
秀まるお さん 05/04/26 11:40
 
>  (a-z])+

  ([a-z])+ を、(([a-z]+) と書いて欲しい

 の間違いでした。

[ ]
RE:07598 HmJre.dll:前方一致/不一致の組No.07601
Iranoan さん 05/04/26 11:58
 
 秀まるおさん今日は、Iranoan です。
>  Perlでどうかまではよく分かってないんてすけど、前方一致/後方一致/前方
> 不一致/後方不一致についてはタグ付き正規表現のカッコカウントの対象から外
> れる仕様になっていて、その仕様はそのままにしたいです。
 解りました。
 複数のソフトウェアで統一していた方がよいとは思いますが、何か規格があ
るわけではないですからね。

[ ]
RE:07599 HmJre.dll:前方一致/不一致の組No.07603
Iranoan さん 05/04/26 11:58
 
 秀まるおさん今日は、Iranoan です。
> >  (a-z])+
>
>   ([a-z])+ を、(([a-z]+) と書いて欲しい
>                ~~~
 興味本位なのですが、括弧の対応を考えると、
([a-z])+ を、([a-z]+) と書いて欲しい
             ~~
では無いでしょうか?

[ ]
RE:07601 HmJre.dll:前方一致/不一致の組No.07604
tarox さん 05/04/26 12:54
 
> 秀まるおさん今日は、Iranoan です。
>>  Perlでどうかまではよく分かってないんてすけど、前方一致/後方一致/前方
>> 不一致/後方不一致についてはタグ付き正規表現のカッコカウントの対象から外
>> れる仕様になっていて、その仕様はそのままにしたいです。
> 解りました。
> 複数のソフトウェアで統一していた方がよいとは思いますが、何か規格があ
>るわけではないですからね。

ただ、(?...)のカッコをカウントに入れないのはかならずしもPerlに限った話ではな
く、正規表現ではかなり一般的な話なので、かなり違和感があるんですが。
たとえば、JScript、VBScriptにおいてもそうなってますし、Rubyとか、またPostgre
SQLなどのSQLでもそうなってます。
参考:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/libr
ary/ja/script56/html/js56jsgrpregexpsyntax.asp

つまり、極端な話、(?...)のカッコをカウントに入れるというのは、ほかから見たら
「仕様が間違ってる」といわれても仕方がない状況だと思いますが。

[ ]
RE:07603 HmJre.dll:前方一致/不一致の組No.07605
秀まるお さん 05/04/26 13:22
 
>  興味本位なのですが、括弧の対応を考えると、
> ([a-z])+ を、([a-z]+) と書いて欲しい

 そもそもの例として良くなかったんですけど。

 (abc|xyz)+

 とか、とにかく見た目的にカッコがネストゼロの所にあるようなケースで、そ
の見た目上のネストゼロのカッコが\1とかの対象になるかどうかは不定と思って
欲しい、みたいな意味です。

[ ]
RE:07605 HmJre.dll:前方一致/不一致の組No.07609
Iranoan さん 05/04/26 16:20
 
 秀まるおさん今日は、Iranoan です。
> 見た目的にカッコがネストゼロの所にあるようなケースで、そ
> の見た目上のネストゼロのカッコが\1とかの対象になるかどうかは不定と思って
> 欲しい、みたいな意味です。
 承知しています(^^)。

[ ]