デリミター付きで列挙させた入れ子パターNo.39495
fzok4234 さん 22/01/08 14:35
 
毎度お世話になっております。

さて、HmJre.dllの部分式呼び出しの使い方についてですが、以下のように
入れ子構造がデリミターで連結された文字列に上手くマッチできません。

(a,a,(a),a,(a,a),(a,(a,a),a),a)

現時点で思いついたパターンは次のようなものです。

(?<pattern>\((?<item>a|\g<pattern>)(?:,\g<item>)*\))

pattern は全体の構造で item は各要素です。どこか間違いがあればご指摘
よろしくお願いします。

秀丸エディタのバージョンは 9.12β2 です。


[ ]
RE:39495 デリミター付きで列挙させた入れNo.39496
秀まるお2 さん 22/01/09 17:20
 
 テストしてみたら、HmJre.dllだと無限再帰呼び出しでエラーになってしまいました。

 Hmonig.dll(鬼車)でテストしたらちゃんと動作するようです。

 秀丸メールの場合、内部的な事情でこういうケースはダメみたいです。複数の部分
式がおたがいに入れ子になってるようなのはエラーになってしまいます。

 とりあえず、僕がちょっと考えてみたんですが、

    (?<name>\((a|\g<name>)(|,(a|\g<name>))*\))

 で今回のケースにはヒットするように思うんですが、それでダメでしょうか。

[ ]
RE:39496 デリミター付きで列挙させた入れNo.39497
秀まるお2 さん 22/01/09 17:37
 
>  秀丸メールの場合、

 「HmJre.dllの場合」でした。

[ ]
RE:39497 デリミター付きで列挙させた入れNo.39498
fzok4234 さん 22/01/09 18:20
 
回答ありがとうございます。

> (?<name>\((a|\g<name>)(|,(a|\g<name>))*\))
>
> で今回のケースにはヒットするように思うんですが、それでダメでしょうか。

この方法だと、要素の「a」を 2 回記述しなければいけないという問題があります。

今回のケースでは簡略に説明するため、各 item を「a」1 文字にしていますが、実
際の運用では
「a」に入る文字列はもっと複雑なパターンで、「a」を表す正規表現はかなり長い物
となっています。
したがって、上記のやり方だと 2 箇所ある「a」の部分に同じ正規表現を繰り返し記
述しなければならず、
人的ミスによる意図しない動作や、正規表現を使ったマクロや強調表示のファイルの
管理負担の増大を
招いてしまいます。

(as,df,gh,jk,)

というように item とデリミターとの位置関係が 1 対 1 の場合は素直に item のパ
ターンに * を使えば
よいのですが、

(as,df,gh,jk)

というようにデリミターが必ず item と item の間に挟まれている場合ではどうして
も item のパターンを
2 回記述しなければなりません。このことは部分式呼び出しの機能を使い始める前か
ら当方で問題となって
おりました。


[ ]
RE:39498 デリミター付きで列挙させた入れNo.39499
秀まるお2 さん 22/01/10 09:49
 
> したがって、上記のやり方だと 2 箇所ある「a」の部分に同じ正規表現を繰り返し
>記述しなければならず、

 そもそも的に今回の話は部分式を使っての話な訳なので、その部分も部分式にすれ
ばいいだけのような気がします。

    (?<n1>\(((?<n2>a)|\g<n1>)(|,(\g<n2>|\g<n1>))*\))

 n1の中にn2が入ってますが、そのn2の中にn1が入ってるような相互の入れ子構造で
なければ、無限再帰呼び出しのエラーにはならないです。

> (as,df,gh,jk)
>
> というようにデリミターが必ず item と item の間に挟まれている場合では

 括弧がネストしてなくていいのであれば、僕なら多少手抜きして、

    \(([a-z]+(|,))+\)

 みたいな記述にしてしまうかなぁと思います。それか、

    \(([a-z]+(|,))+(?<!,)\)

 にすれば  (aa,) にはヒットしなくなります。

[ ]
RE:39499 デリミター付きで列挙させた入れNo.39505
fzok4234 さん 22/01/13 11:11
 
> (?<n1>\(((?<n2>a)|\g<n1>)(|,(\g<n2>|\g<n1>))*\))
>
> n1の中にn2が入ってますが、
> 「そのn2の中にn1が入ってるような相互の入れ子構造でなければ」、
> 無限再帰呼び出しのエラーにはならないです。

残念ながら、当方で扱うデータ構造は正に「 n1 と n2 とが相互に入れ子」になって
いることが多いです。
というか、一般的なプログラミング言語の構造はほぼ間違いなくこの「相互入れ子」
になっていて、
正規表現を用いての検索や強調表示などを困難なものにする要因となっています。


> 括弧がネストしてなくていいのであれば、僕なら多少手抜きして、
>
> \(([a-z]+(|,))+\)
>
> みたいな記述にしてしまうかなぁと思います。それか、
>
> \(([a-z]+(|,))+(?<!,)\)
>
> にすれば  (aa,) にはヒットしなくなります。

この方法があることは意外でした。入れ子構造を伴わない単純なリストのときに、ぜ
ひ参考にさせて
いただきます。


[ ]
RE:39505 デリミター付きで列挙させた入れNo.39506
秀まるお2 さん 22/01/13 11:54
 
> 残念ながら、当方で扱うデータ構造は正に「 n1 と n2 とが相互に入れ子」になっ
>ていることが多いです。

 具体的な例を教えてもらえないとなんとも言えない所です。

 ちなみにこの辺のテストをしてて、いくつかバグを見つけてしまいました。

    \(([a-z]+(|,))+(?<!,)\)

 のパターンを部分式にして

    (?<name>\((([a-z]+|\g<name>)(|,))+(?<!,)\))

 みたいにしたらいいかと思ったら、これがうまく動きませんでした。さらには無限
再帰呼び出しかどうかの判定ロジックもいまいち正しくなくて、無限再帰呼び出し判
定すべき物がそう判定されないケースが多々あるのと、その逆のパターンもあるよう
で、とりあえず、間違って検索できないのはまずいので、間違ってエラーになるケー
スをエラーにならないように修正しました。例えば

    (?<name>\g<name>)

 みたいなのはダメなんですが、とりあえず次のバージョンではエラーにならないよ
うにします。

 それと、「n1とn2が相互に入れ子」のケースについて、現状のHmJre.dllの処理だ
と仮にエラーで止めないでおくと実際に無限呼び出しになって落ちてしまうんですが、
どこかで有限で止めるようにすれば大丈夫になるかと思います。その辺も1回トライ
してみます。

[ ]
RE:39506 デリミター付きで列挙させた入れNo.39507
fzok4234 さん 22/01/13 14:40
 
> 具体的な例を教えてもらえないとなんとも言えない所です。

例えば C# のラムダ式など、最近の言語で見かける無名関数式とかです。

一般的にプログラミング言語では構文上「文」と「式」とを明確に区別しています。
通常、メソッドなどのプログラム実行単位は

    public void Method() {
        文
        文
        文
        …
        文
    }

というような「文」のリストとなっています。そして、「文」の中では

    文
    文
    {           // ブロック文の開始
        文
        文
        …
    }           // ブロック文の終了
    文
    文
    …

というブロック文のような「文」同士の入れ子が成立します。また、

    文
    文
    int variable = 式 ;
    文
    文
    if ( 式 )
        文
    else
        文
    文
    文
    …

という宣言代入文や if 文のような「文」の中の「式」の入れ子も成立します。一方、
「式」については

    int variable = 式 + ( 式 / 式 ) * 式 ;

という他項演算で ( 式 / 式 ) の部分も「式」として扱われるように「式」同士の
入れ子も成立します。

ここまでで

・「文」の中に「文」
・「文」の中に「式」
・「式」の中に「式」

のパターンが出てきましたが、では問題の

・「式」の中に「文」

のパターンが存在しないのか言えば、そうは問屋が下ろさず

    System.Func< int , string > func = ( int arg ) => {
        文
        文
        return arg.ToString() ;
    } ;

というラムダ式の場合にはいとも簡単に成立してしまいます。ラムダ式 ( int arg )
 => { … } 自体は
変数 func に代入可能な「式」ですが、その内部に無名関数を構成する「文」のリス
トが存在します。

このように「式」の中の「文」の入れ子も成立する場合、

・「文」の中の「式」の中の「文」の中の「式」の中の「文」の中の「式」の中の …

と永遠に続く「相互入れ子」が構成されることになります。

当方では、こうしたプログラミング言語の入れ子構造に対する正規表現による検索や
強調表示などが
上手くできない問題を長年抱えております。



[ ]
RE:39507 デリミター付きで列挙させた入れNo.39508
秀まるお2 さん 22/01/13 15:25
 
 たしかに最近のJavaScriptのライブラリなんかはラムダ式使いまくりで秀丸エディ
タを使って関数一覧を表示させることも出来ず、なんとか出来ない物かと考えたこと
はありましたが・・・・、正規表現でなんとかするには、そもそも複数行に渡ってマ
ッチングできない秀丸エディタの仕組み的に無理があるので、どっちみち無理かとは
思います。

 とりあえず、複数部分式のおたがい入れ子がうまく動くように出来るかどうかは、
今トライしている所ではあります。ダメな場合でも1回バグ修正のために、来週くら
いにバージョンアップ版を秀丸エディタに添付したいと思います。

[ ]
RE:39508 デリミター付きで列挙させた入れNo.39514
秀まるお2 さん 22/01/19 16:04
 
 先ほど秀丸メールのVersion 7.10β19をアップロードしたんですが、それに添付し
てるHmJre.dllのVersion 5.25の方で、今回の多重入れ子対応などしています。他に
もバグも見つかったので直してます。

 もしよかったらそっちからHmJre.dllだけ抜き取って使ってみてほしいです。

 次の秀丸エディタのβ版にも添付させていただくことになります。

 ちなみに最初の発言にあった正規表現パターンはうまく動作することを確認してい
ます。

[ ]
RE:39514 デリミター付きで列挙させた入れNo.39515
fzok4234 さん 22/01/19 19:26
 
アップデートの方ありがとうございます。

試しに HmJre.dll 5.25 に入れ替えてテストしてみましたが、まだ少し詰めの甘い感
じがありました。
検索対象

(asde,heysa,(aswe,(juiej,(())),iuygj,((kiuj,jhgt),(derss))),ujouh,(louhg,((d
ewf)),(gjui,iutj)),(oujg,(wsfe),()))

に対して正規表現パターン

(?<pattern>\((?:(?<item>(?:[a-z]+)|\g<pattern>)(?:,\g<item>)*)?\))

で、「大文字 / 小文字の区別」と「単語の検索」を有効にして検索したところ、文
字列全体にはマッチせずに
7 箇所に分かれて飛び石でマッチしてしまいました。

一方 hmonig.dll 0.87 だと正しく文字列全体にマッチしました。


[ ]
RE:39515 デリミター付きで列挙させた入れNo.39516
秀まるお2 さん 22/01/20 09:53
 
 毎度テストありがとうございます。僕の所でもテストしてダメなことが確認できま
した。

 (...)?

 があるとダメということで・・・・。ちなみに

 ((...)|)

 にするとうまくヒットするようなので、「?」の中の処理が関係してるのかなぁと
思います。

 なんとか原因を調べて修正したいと思います。

[ ]
RE:39516 デリミター付きで列挙させた入れNo.39518
秀まるお2 さん 22/01/20 11:51
 
 調べてみたら、たしかに(...)?の展開にバグがありました。前々からバグってまし
た。

 また修正してVersion 5.26として次回秀丸エディタβ版などに添付させていただき
ます。

[ ]
RE:39518 デリミター付きで列挙させた入れNo.39522
秀まるお2 さん 22/01/21 10:49
 
 秀丸エディタの次のβ版がまざ先になりそうなので、とりあえず秀丸メールに添付
してアップロードしました。

 もしよかったらまた確認お願いします。

 HmJre.dllのバージョンはV5.26になってます。

 HmJre.dllでの部分式のネストについての処理は、単純に正規表現パターンをネス
ト最大数まで展開するような処理をしてまして、その展開の処理の中での、(...)?お
よび(...)??の配慮ミスがありました。

 よろしくお願いします。

[ ]
RE:39522 デリミター付きで列挙させた入れNo.39525
fzok4234 さん 22/01/21 14:50
 
v5.26 にて先ほどのパターンが正常にマッチすることが確認できました。
対応ありがとうございます。


[ ]