◀一般トップへ
  • 7195 正規表現の不安定動作?
    • 7196 途中報告
    • 7197 一人言
      • 7200 Re:一人言
        • 7201 Re2:動作確認しました
    • 7198 Re:正規表現の不安定動作?
    • 7199 自己レス
    • 7202 結果報告
    • 7210 後日談(機能要望)
  • [7195] 正規表現の不安定動作? System_UPJ 2010年05月25日 02:07

    正規表現の実装で困っています。(Ver1.6.5.0)
    青空文庫形式の正規表現色分けを行うため、以下の記述を行いました。
    (実装しているのは百字に近い、非常に長いものです)
    (以下は、現象を再現できる範囲で単純化したものです)

    正規表現キーワード1(赤色強調)
    /(?<=』)[^」]*?」/k
    正規表現キーワード2(青色強調)
    /(?<=」)[^』]*?』/k

    以上の設定により、以下の文字列が赤・青交互に強調されるよう意図しています。
    』初」二』三」四』五」六』七」八』九」

    しかし、実際の現象として、四』と八』のみ青色に強調されないのです。

    正規表現キーワード1と2の順番を入れ替えると、今度は三」と七」のみ強調されなくなります。
    この現象を回避する方法がありましたら、ご教授いただければ幸いです。
    • [7196] 途中報告 ds14050 2010年05月25日 18:10

      1. たしかにおっしゃる通りの現象が見られました。

      2.Ruby1.9の鬼車では 四』と八』もマッチしますから
      サクラエディタの問題です。

      3.試しに色設定を正規表現キーワード2から
      URL(青色・下線・クリッカブル)に変更すると
      四』と八』の文字色は黒にもかかわらずマウスカーソルは
      手の形に変化に変化しました。
    • [7197] 一人言 ds14050 2010年05月25日 18:47

      トラッカーがエラーで開けない。

      戻り読みが使える = bregonig.dll = BMatchExが使える。
      というわけで、BMatchExが使えるときはそちらを使うことで直りました。

      登録の順番に依存して、片方のキーワードにしか問題が生じない
      理由がわからない。
      • [7200] Re:一人言 ryoji 2010年05月26日 00:30

        ▼ ds14050さん
        > 戻り読みが使える = bregonig.dll = BMatchExが使える。
        > というわけで、BMatchExが使えるときはそちらを使うことで直りました。

        まだちゃんと確認してませんが、たぶんこれで大丈夫そうですね。

        > 登録の順番に依存して、片方のキーワードにしか問題が生じない
        > 理由がわからない。

        自分は、行頭や色が変わる位置で CRegexKeyword::RegexIsKeyword() の動作をじっくり追っかけてみたら理由がわかりました。
        • [7201] Re2:動作確認しました ryoji 2010年05月26日 19:06

          > まだちゃんと確認してませんが、たぶんこれで大丈夫そうですね。
          確認しました。OKと思います。
    • [7198] Re:正規表現の不安定動作? ds14050 2010年05月25日 19:52

      System_UPJさんがすぐに行える回避策で自分が思いつくのは、
      戻り読みを使わずに先読みなどで代用することです。
      代用できない場合はバージョンアップを待つ必要があると思います。

      # トラッカーの、group_idが指定されていないというエラーが
      # なくなっていたので Patchesの方へパッチを投稿しました。
    • [7199] 自己レス System_UPJ 2010年05月25日 21:18

      ds14050さん、検証およびアドバイス、ありがとうございます。
      現象の再現性が確認できたようですので、
      バージョンアップを気長に待ちたいと思います。m(_ _)m

      ●余談1●
      > 正規表現キーワード1(赤色強調)
      > /(?<=』)[^」]*?」/k
      > 正規表現キーワード2(青色強調)
      > /(?<=」)[^』]*?』/k

      問題を起こす上記2行を、以下の4行で書き換えると、問題を回避できます。
      しかしこれだと、独立した」』も染まってしまうので、意図した動作となりません。
      かといって、可変長の戻り読みは使えないので・・・と、思案中です。
      /(?<=』)[^」]*?(?=」)/k
      /(?<=」)[^』]*?(?=』)/k
      /』/k
      /」/k


      ●余談2●
      上記問題に関係しているのは、青空文庫形式に対応する以下の正規表現です。
      2種の鍵カッコを、交互ネストを許容しつつ、かつ連続ネストを否定しながら、
      他種の全角カッコ|《》[]を避けて染めることを意図しています。

      他記号含む「」『』内 先端
      (赤)/「[^|《》[]「」『』]*?(?=[|《[『].*?」)/k
      (青)/『[^|《》[]「」『』]*?(?=[|《[「].*?』)/k

      他記号含む「」『』内 他記号間
      (赤)/(?<=[》]』])[^|《》[]「」『』]+?(?=[|《[『][^「]*?」)/k
      (青)/(?<=[》]」])[^|《》[]「」『』]+?(?=[|《[「][^『]*?』)/k

      他記号含む「」『』内 終端
      (赤)/(?<=[》]』])[^|《》[]「」『』]*?」/k
      (青)/(?<=[》]」])[^|《》[]「」『』]*?』/k

      この最後の2行がうまく動かず、思案しているところです。
      問題が解決しましたら、青空文庫編集用マクロ・設定集としてまとめ、
      どこかで公表したいと思っています。

      よろしくお願いします。
    • [7202] 結果報告 ds14050 2010年05月27日 03:16

      ソースコードを修正しましたので次の版では直っているはずです。
      わかりやすい報告をありがとうございました。

      >余談
      他のパターンは試されていると考えるのが当然でした。これは難しい。
    • [7210] 後日談(機能要望) System_UPJ 2010年06月09日 01:21

      お世話になっております。
      その後も、折を見ては正規表現を書いています。
      |《》[]「」『』()の全角記号をネストチェックしつつ染めることが目標ですが、文字数制限(99字)が厳しい。
      下の9行で目指す機能を実現できる(と思う)のですが、1行の文字数が150字(byte)程度に達してしまいます。

      /「[^|《》[]「」『』()]*?(?=[|《[『(])(?=([^[]「」『』()]|[[^[]]*?]|「[^「」]*?」|『[^『』]*?』|([^()]*?))*?」)/k
      /『[^|《》[]「」『』()]*?(?=[|《[「(])(?=([^[]「」『』()]|[[^[]]*?]|「[^「」]*?」|『[^『』]*?』|([^()]*?))*?』)/k
      /([^|《》[]「」『』()]*?(?=[|《[「『])(?=([^[]「」『』()]|[[^[]]*?]|「[^「」]*?」|『[^『』]*?』|([^()]*?))*?))/k
      /(?<=[》]』)])[^|《》[]「」『』()]+?(?=[|《[『(])(?=([^[]「」『』()]|[[^[]]*?]|「[^「」]*?」|『[^『』]*?』|([^()]*?))*?」)/k
      /(?<=[》]」)])[^|《》[]「」『』()]+?(?=[|《[「(])(?=([^[]「」『』()]|[[^[]]*?]|「[^「」]*?」|『[^『』]*?』|([^()]*?))*?』)/k
      /(?<=[》]」』])[^|《》[]「」『』()]+?(?=[|《[「『])(?=([^[]「」『』()]|[[^[]]*?]|「[^「」]*?」|『[^『』]*?』|([^()]*?))*?))/k
      /(?<=[》]』)])[^|《》[]「『』()]*?」/k
      /(?<=[》]」)])[^|《》[]「」『()]*?』/k
      /(?<=[》]」』])[^|《》[]「」『』(]*?)/k

      可能であれば、バージョンアップ時に制限文字数を拡大してしていただけるよう、リクエストします。
      (外部ライブラリの制限だとすれば難しいでしょうが・・・?)