11 返信 最新の回答 日時: May 21, 2008 11:04 AM ユーザー:k-ooishi

    FindGrepでカタカナの検索

    k-ooishi Level 1
      Indesign CS3です。
      FindGrepでUTF8のカタカナの検索をするとヒットしませんでした。
      あれこれ試してみると、
      app.findChangeGrepOptions.kanaSensitive = false;
      とか
      app.findChangeGrepOptions.widthSensitive = false;
      とかの条件を付け加えると上手くいくようです。しかし、こういう書き方は適切なのでしょうか?
      widthSensitive = false;は「全角と半角を区別しない」だからこれでもヒットするんですかね?
      kanaSensitive = false;というのはどういう意味になるのでしょう?kanaSensitive = true;だとカタカナがヒットしない。falseだとヒットする。
      ううむ意味不明…。
        • 1. Re: FindGrepでカタカナの検索
          k-ooishi Level 1
          CS3で新設された関数FindGrepの設定について、その後試行錯誤しながらわかってきたことを書いておきます。

          kanaSensitive=true(カタカナとひらがなを区別する):検索語がUTF-8のカタカナの場合(読み込みテキストの.encoding = "UTF8"で設定)、検索対象に全角カタカナがあってもマッチしない。これはバグではないかと思う。
          kanaSensitive=false(カタカナとひらがなを区別しない):正常に動作するようだ。
          以上のことから、現状ではカタカナを含む語句を検索する場合は、kanaSensitive=falseで検索し、検索結果からカタカナの語句のみを抽出する必要がある。

          widthSensitive=true(半角と全角を区別する):正常に動作するようだ。
          widthSensitive=false(半角と全角を区別しない):理屈からすればwidthSensitive=trueで検索できた語句を全部検索できるはずだがそうならない。なぜか widthSensitive=trueで検索できた語句で漏れるものがある。
          したがって、widthSensitive=falseの結果を望む場合は、widthSensitive=falseとwidthSensitive=trueで2度FindGrepをしな いと完璧な検索結果が得られない。

          現状ではこの仕様を理解し、補助的な対策を講じないと、正常な結果は得られません。
          …ということなのですが、なにか、勘違いをしてるのかなあ?
          • 2. Re: FindGrepでカタカナの検索
            Level 1
            あのう、「なにか、勘違いをしてるのかなあ?」という言葉に引っかかったので書き込ませていただきます。
            なお、わたしはInDesignのFindGrep(正規表現検索)を使ったことがないので、あくまで「個人的な感想」です。てめえ、使ってもいないのに何言いやがるといわれれば、そのとおり です。最初に謝っておきます。

            ひとつ思ったのが、これはテキスト検索ではなくて、正規表現検索ですよね。すると「半角と全角を区別する、しない」などの設定は意味がないんじゃないでしょうか。つまり「A」という文字列を検 索する場合、半角と全角を区別するなら「A」と、区別しないのなら「[AA]」で検索するのが正規表現検索だと思うのですが。
            だとすると「半角と全角を区別する、しない」などの設定は必要ないということになりませんか? 何のためにその設定が生きているのか不明ですが、わたしは正規表現検索の場合にそれらの設定は不要だと思います。また、「バグではないか」と思われる点についても、InDesignのプログ ラムの作成者がわたしと同じ考えなら、正規表現検索でその設定を行っても意味がないのは「仕様」です、と言い切られるかもしれませんね。
            • 3. Re: FindGrepでカタカナの検索
              k-ooishi Level 1
              お〜まちさん。いつもお世話になっております。
              >「半角と全角を区別する、しない」などの設定は必要ないということになりませんか
              データ自体が正規表現表記になっていない場合は、「半角と全角を区別する、しない」の設定があったほうが便利じゃないでしょうか?
              今回の問題のいくつかの例をあげてみます。
              検索語句が「2月」でIndesign本文中に「2月」がありました。
              widthSensitive="false"だとマッチしました。
              widthSensitive="true"だとマッチしませんでした。
              これは納得できます。
              widthSensitive="false"の場合「2月」は「2月」と「2月」に展開されるからですね。
              これはいいんです。
              しかし、この理屈だと、"false"は"true"の領域をすべてカバーするはずだと思うのですが、"false"にするとヒットしないものが一部発生します。これが問題なんです。
              どうも、語句に"="や"."という正規表現っぽいものがあると正常な結果が得られないようです。
              正規表現の解釈が"false"と"true"で違うということでしょうか?
              "."は正規表現では任意の一字ということですから、「E.S.の版画家」は"false"でも"true"でも「E.S.の版画家」にマッチしなくてはいけないと思うのですが、"true" でないとマッチしません。
              「フランコ=フラマン派」も同様に"true"でないとマッチしません。
              Indesignの正規表現の解釈がおかしい?それとも私の正規表現理解が不十分?
              というわけで、今回はwidthSensitive="false"と"true"で2度検索しました。
              • 4. Re: FindGrepでカタカナの検索
                Level 1
                調べてみると、テキスト検索と比較してGREP検索ではcaseSensitiveは削除されているのにkanaSensitiveとwidthSensitiveは削除されていません。正規 表現検索ということであれば、このオプションも当然削除されてしかるべきです。それなのに残っているというのがそもそも不思議ですね。
                今改めてヘルプを見ました。すると
                「検索と置換ダイアログボックスの「GREP」タブでは、長いドキュメントや多数の開いているドキュメントで英数字文字列を検索する GREP 式を作成できます。」
                とあります。「英数字文字列」!
                これは一体何? どこまでが対象になっているの? 少なくとも2バイト文字はGREPの対象外?
                この先数日はInDesignでテストすることができないので確認ができませんが、InDesignの正規表現検索には何か罠がありそうです。
                • 5. Re: FindGrepでカタカナの検索
                  k-ooishi Level 1
                  「英数字文字列」…うう、悩ましい。
                  実際にテストでは漢字も拾ってますので、日本語版は漢字も対象としていることは間違いないですが…。ただ正規表現を展開した結果がどの程度マッチするのかは不安ですね。きちんと説明したドキュ メントが欲しいですね、特にこの日本独自仕様の周辺。
                  • 6. Re: FindGrepでカタカナの検索
                    seuzo-oJiFme Level 1
                    まあ、やりたいことがいまひとつ理解できないで、申し訳ないんですが。。。

                    正規表現は「あいまい検索」と誤解されがちですが、本来とてもシビアで正確性を求められる検索だと思うんです。
                    たとえば「A」というリテラルと検索すると、○付きや括弧付きなどの修飾字形や、ウムラウト付きの字形にもヒットします。
                    これは「あいまい検索」な振る舞いであって、正規表現じゃなくなってしまう。
                    そもそも、GREPなんて用語があいまいすぎる^^
                    #GREPはedエディタの関数名、もしくはgrepユーティリティを指すと思う。なぜ「regex」でも「正規表現」でもなく「GREP」なの?
                    この、全角半角を区別するオプションも、なんだかヘンな挙動をします。「全角」って何? 「半角」って何さ? みたいな気分なんです、わたし。
                    お〜まちさんがおっしゃるように、本来こういう問題は文字クラスに担当させるべきだし、i18nに配慮したかったら、ロケールに依存しないPOSIX文字クラスを援用すればいいのになあ、と。
                    Adobeの中の人には、もうすこしグローバルな視点で開発なり、UI設計をしていただきたいと願っています。
                    • 7. Re: FindGrepでカタカナの検索
                      seuzo-oJiFme Level 1
                      あー、おっしゃっていることがようやくわかりました。理解が遅くてすいません^^
                      「UTF8のカタカナ」ってなんだろう? と思っていたのです。

                      スクリプトでなくても再現します。
                      [ァ-ヾ]+
                      と表現したとき、「カナを区別」「全角半角を区別」のオンオフに関係なく、ひらがなにもヒットします。
                      こりゃまずい。
                      おもしろい(?)のは
                      [ア-ン]+
                      を指定したときに、「カナを区別」がオンになっているとカタカナにはヒットせずにひらがなにヒットする。「カナを区別」がオフになっているとカタカナひらがなにヒットする。

                      追試できた方は、不具合報告ページで報告してください。
                      • 8. Re: FindGrepでカタカナの検索
                        seuzo-oJiFme Level 1
                        で、回避方法も載せておきます。
                        [¥x{30a1}-¥x{30fe}]+
                        と書いてみてください。
                        こうすると、「カナを区別」のオンオフ関係なく[ァ-ヾ]+ にヒットします。
                        「カナを区別」をオフにしているのに、ひらがなを区別するのはどうなのか、という疑問は残りますけれど^^
                        • 9. Re: FindGrepでカタカナの検索
                          seuzo-oJiFme Level 1
                          ちなみに、JavaScriptからの操作でも同様の結果でした。
                          テストに使用したスクリプトは以下の通りです。

                          ////////////////////////////////////////////エラー処理
                          function myerror(mess) {
                          if (arguments.length > 0) { alert(mess); }
                          exit();
                          }

                          ////////////////////////////////////////////正規表現検
                          //正規表現で検索して、ヒットオブジェクトを返すだけ
                          function my_regex(my_range_obj, my_find_str, my_change_str) {
                          //検索の初期化
                          app.findGrepPreferences = NothingEnum.nothing;
                          app.changeGrepPreferences = NothingEnum.nothing;
                          //検索オプション
                          app.findChangeGrepOptions.includeLockedLayersForFind = false;//ロックされたレイヤーをふくめるかどうか
                          app.findChangeGrepOptions.includeLockedStoriesForFind = false;//ロックされたストーリーを含めるかどうか
                          app.findChangeGrepOptions.includeHiddenLayers = false;//非表示レイヤーを含めるかどうか
                          app.findChangeGrepOptions.includeMasterPages = false;//マスターページを含めるかどうか
                          app.findChangeGrepOptions.includeFootnotes = false;//脚注を含めるかどうか
                          app.findChangeGrepOptions.kanaSensitive = true;//カナを区別するかどうか
                          app.findChangeGrepOptions.widthSensitive = true;//全角半角を区別するかどうか

                          app.findGrepPreferences.findWhat = my_find_str;//検索文字の設定
                          //app.changeGrepPreferences.changeTo = my_change_str;//置換文字の設定
                          return my_range_obj.findGrep();//検索の実行
                          }

                          ////////////////////////////////////////////字形の一括変換
                          /*
                          my_obj 字形を変更したいテキストオブジェクト
                          my_gliph グリフフォーム(ex. AlternateGlyphForms.MONOSPACED_HALF_WIDTH_FORM;//半角字形
                          */
                          function all_glyph_change(my_obj, my_gliph) {
                          for (var i = 0; i < my_obj.length; i++) {
                          my_obj[i].glyphForm = my_gliph;
                          }
                          }

                          /////実行
                          ////////////////まずは選択しているもののチェック
                          if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
                          var mydocument = app.activeDocument;

                          ////////////////検索の実行
                          var hit_obj = my_regex(mydocument, "[ア-ン]+", "");
                          //var hit_obj = my_regex(mydocument, "[ァ-ヾ]+", "");
                          mydocument.select (hit_obj[0]);
                          • 10. Re: FindGrepでカタカナの検索
                            seuzo-oJiFme Level 1
                            いわずもがなですが、スクリプト中に¥を書くときはエスケープしてください。
                            "[¥¥x{30a1}-¥¥x{30fe}]+"
                            • 11. Re: FindGrepでカタカナの検索
                              k-ooishi Level 1
                              ひええ。
                              昨日の午後から別件で走り回っている間に、大量の書き込みが…。
                              市川せうぞーさん、ありがとうございます。

                              >[ア-ン]+
                              >を指定したときに、「カナを区別」がオンになっているとカタカナにはヒットせずにひらがなにヒットする。「カナを区別」がオフになっているとカタカナひらがなにヒットする。

                              「カナを区別」あるいは、kanaSensitive="true"の場合、検索語がカタカナであっても「ひらがなにヒット」する…ということですか。私はカタカナがヒットしないことだけに注 目していましたが。
                              しかし、「カナを区別」の意味が「ひらがなにヒット」とは日本語としておかしいですよね。
                              バグですよね。これ。それともAdobeではそういう解釈をしている?
                              管見ではkanaSensitiveの仕様について書いたドキュメントは無いので、そうだと言われれば従うしかありませんが…。

                              >で、回避方法も載せておきます。
                              >[¥x{30a1}-¥x{30fe}]+
                              >と書いてみてください。
                              >こうすると、「カナを区別」のオンオフ関係なく[ァ-ヾ]+ にヒットします。

                              ありがとうございます。
                              今回の得意先の要望は、語句のリストを支給するから、本文から索引を作成せよというものでした。
                              いちいちカナを文字コードに置換するのも鬱陶しいので、今回はkanaSensitive="false"にして、カタカナでもひらがなでもマッチさせて、ひらがなを除外する方法をとりました 。
                              得意先に対しては、Indesignのカタカナ検索はkanaSensitive="true"の場合正常に機能しないと報告しました。