タグ付き正規表現の動作についてNo.28936
ぬべぬべにべあ さん 10/09/20 20:18
 
フォーラムの皆様こんにちは、初めて投稿します。

早速ですが質問があります。
以下のような文字列からタグ付き正規表現で部分的に取り出したい時、

ABC\DEF\GHI

(.*)\\.* → \1=ABC\DEF
.*\\(.*) → \1=DEF\GHI

のようにカッコの位置によって結果が異なるのは仕様でしょうか?
意図せぬ動作なのではないかと思うのです。

使っているバージョンはv8.01です。


[ ]
RE:28936 タグ付き正規表現の動作についてNo.28938
ぬべぬべにべあ さん 10/09/20 21:04
 
すみません少し間違えました。
正規表現の2行目が、

.*\\(.*) → \1=GHI

となるべきでは?という意味です。

[ ]
RE:28938 タグ付き正規表現の動作についてNo.28939
秀まるお2 さん 10/09/21 09:11
 
 調べてみたら、またしてもタグ付き正規表現に関係したバグでした。

 大変失礼しました。

 ということでまた修正させていただきます。

[ ]
RE:28939 タグ付き正規表現の動作についてNo.28941
秀まるお2 さん 10/09/21 09:40
 
 ついでに申告させていただくと、以前colderさんから報告いただいてたバグが
一度修正出来ていたはずが、またレベルダウンしてたことも判明してしまいまし
た。

 「検索パターン「(.{3,}).*\1e」が「xabcdfabcde」にマッチしない」

 の件がレベルダウンしてました。

 これまた修正させていただきます。

[ ]
RE:28941 タグ付き正規表現の動作についてNo.28946
秀まるお2 さん 10/09/21 14:01
 
 すみませんが、これの件は、やっぱり仕様とさせていたたくしか無いような気
がします。

 基本的に「.*」というのは、もっとも長い物にヒットするというのが正しい動
作となる訳ですが、「.*」を2つ並べた場合に、先に指定した方が長くヒットし
なければないなら、というルールは存在しないです。例えば

 「(.*)a(.*)」

 という正規表現パターンがあったとして、それが、

 「aaa」

 という文字列に対して、

 \1相当 = ""
 \2相当 = "aa"

 \1相当 = "a"
 \2相当 = "a"

 \1相当 = "aa"
 \2相当 = ""

 のどれになるかの保証は無いし、実際、それを保証することが出来ないような
内部的なロジックになっています。

 内部的なロジックがどうしてそうなってしまうかというと、つまり、例えば上
記のパターンの例でいうと、一度「aaa」に対してヒットするパターンが見つか
った場合には、もうその「aaa」に対してヒットするパターンはすべて除外する
ような処理をしています。それによって検索が高速化されるからです。

 ということで、これは仕様とさせていただくしか無いです。

 今回のケースで、例えば

  ABC\DEF\GHI

 の「GHI」の部分だけ抽出したいということでしたら、

 .*\\(.*)

 ではなくて、

 .*\\([^\\]*)

 のように書いていただく必要があります。

[ ]
RE:28946 タグ付き正規表現の動作についてNo.28947
秀まるお2 さん 10/09/21 14:08
 
>  .*\\([^\\]*)
>
>  のように書いていただく必要があります。

 すみません。これだと改行文字も含めてヒットしてしまいました。

    .*\\([^\\\n]*)

 でないとダメでした。

[ ]
RE:28946 タグ付き正規表現の動作についてNo.28951
ぬべぬべにべあ さん 10/09/21 19:49
 
カッコは付属品というか、どこに付けても動作に影響はないと思っていたので意外で
した。
でも高速化のためということで納得いたしました。
調べていただきどうも有難うございました。

[ ]
RE:28946 タグ付き正規表現の動作についてNo.28952
colder さん 10/09/21 22:11
 
> 基本的に「.*」というのは、もっとも長い物にヒットするというのが正しい動
>作となる訳ですが、「.*」を2つ並べた場合に、先に指定した方が長くヒットし
>なければないなら、というルールは存在しないです。


これって、hmjre.dllのローカルルールですよね。

『詳説 正規表現 第3版』5.2.3.3で、ファイルのフルパスをパス名とファイル名に分
割する例として "^(.*)/(.*)$"という正規表現が使われています。


hmjre.dllでいくつかの正規表現で試したみたところ、問題になるパターンは、「.
*」又は「.+」が使われているパターンのみで、「.」とほぼ同じ意味の「[^\n]」に
変更したところ、期待通りの動作になりました。

hmjre.dllの内部で「.」を「[^\n]」に置き換えることで対応できないでしょうか?

[ ]
RE:28952 タグ付き正規表現の動作についてNo.28953
秀まるお2 さん 10/09/22 08:55
 
> 『詳説 正規表現 第3版』5.2.3.3で、ファイルのフルパスをパス名とファイル名に分
> 割する例として "^(.*)/(.*)$"という正規表現が使われています。

 それは…、「先に指定した.*の方が長くマッチする」というのを経験的に知っ
ててそういう正規表現パターンを書いたのかなぁという気がしますけども…。

 まぁしかし、世の中の正規表現処理系はみんなそういうロジックになっている
訳なので、HmJre.dllも同じロジックにした方が無難な気がします。

 ということで、処理の中身を見直して、同じロジックになるように修正させて
いただきます。

 速度的にも大して違わないと思いますので。(ワーストケース/ベストケース
いろいろあって、必ずしも僕のやり方がすべてのケースで速い訳でも無かったり
はします)

 ということで長々とお手数かけてすみませんが、次のバージョンにて修正させ
ていただきます。

[ ]