Re: ACFinder 120519test版
OhYeah!
投稿数: 983
オンライン

引用:しかも、作物選択ダイアログボックスで「上位分類含む」のチェックを外したときは OK てことは、上位分類含むのチェックの有無で処理が異なる部分に注目すれば、原因が見えてきそうです。特に、TPerlRegEx 周りの使い方に違いがあるでしょうか?Log に見える範囲では、上位分類含むのチェックの有無による違いはなさそうなので、Log に出ない部分で何か違うのかな?
それはそれとして、テキストボックス直接入力と、ダイアログボックス選択では、展開される正規表現が異なるんですね。テキストボックス直接入力だと前方一致検索用に展開され、'(' も '\(' とエスケープされます。が、ダイアログボックスを経由すると、追加も置換も無しで終了しても、完全一致用に展開され、NOT REGEXP の条件で '(未' の開き括弧がエスケープされていないため、閉じ括弧がひとつ足りません。
本来なら、ダイアログボックスを経由して追加/置換無しで終了した場合、上位分類含むのチェック状態や最後の ')' だけが省略されたかどうかに拘わらず、閉じ括弧がないエラーにならないとおかしいといえます。少なくとも、2 のケースで、 NOT REGEXP の条件を '\((.*、)?(豆(類)?\(未)(、.*)?を除く' のように開き括弧をエスケープして展開するように修正する必要がありそうです。
1.「豆類(未」とテキストボックスに直接入力した時の作物検索
2. テキストボックスが上記の状態でダイアログボックスを開き、追加/置換なしで終了した時の作物検索
また、1 のケースでは、NOT REGEXP の条件が '\((.*、)?(豆(類)?\(未)(、.*)?を除く' のため、「野菜類(豆類(未成熟)を除く)」を拾ってしまいます。最初の REGEXP の条件のように、検索語の末尾に '.*?' をつけて「'\((.*、)?(豆(類)?\(未).*?(、.*)?を除く」と展開する必要があります。さらに、今のままでは検索語が「豆類(未成熟)」の時に「豆類(未成熟、ただし○○を除く)」が拾えないので、下記のように REGEXP, NOT REGEXP いずれも閉じ括弧を「(\)|、)」または「\(?」と展開する必要があります。後者の方が汎用性が高いですね。開き括弧も「\(?」と '?' 付きに展開した方が良さそうです。
本題ですが、作物選択ダイアログボックスを追加/置換せずに閉じた場合、再検索をしないというのが一番良い解決策だと思います。あと、「豆類(未」のように不完全な作物名を手入力した後にダイアログボックスから追加する可能性を考慮すると、追加の場合は手入力時と同じ前方一致用の正規表現に展開する必要がありそうです。これまた、他の検索パターンで副作用が発生する可能性を否定できませんが…。
それはそれとして、テキストボックス直接入力と、ダイアログボックス選択では、展開される正規表現が異なるんですね。テキストボックス直接入力だと前方一致検索用に展開され、'(' も '\(' とエスケープされます。が、ダイアログボックスを経由すると、追加も置換も無しで終了しても、完全一致用に展開され、NOT REGEXP の条件で '(未' の開き括弧がエスケープされていないため、閉じ括弧がひとつ足りません。
本来なら、ダイアログボックスを経由して追加/置換無しで終了した場合、上位分類含むのチェック状態や最後の ')' だけが省略されたかどうかに拘わらず、閉じ括弧がないエラーにならないとおかしいといえます。少なくとも、2 のケースで、 NOT REGEXP の条件を '\((.*、)?(豆(類)?\(未)(、.*)?を除く' のように開き括弧をエスケープして展開するように修正する必要がありそうです。
1.「豆類(未」とテキストボックスに直接入力した時の作物検索
SELECT sakumotsu FROM m_sakumotsu WHERE concat('、', sakumotsu, betsumei) REGEXP '(^|、|\()(豆(類)?\(未).*?(\)|、|$)' AND concat('、', sakumotsu, betsumei) NOT REGEXP '\((.*、)?(豆(類)?\(未)(、.*)?を除く'
2. テキストボックスが上記の状態でダイアログボックスを開き、追加/置換なしで終了した時の作物検索
SELECT sakumotsu FROM m_sakumotsu WHERE concat('、', sakumotsu, betsumei) REGEXP '(^|、|\()(豆(類)?\(?未)([\(\)]|、|$)' AND concat('、', sakumotsu, betsumei) NOT REGEXP '\((.*、)?(豆(類)?(未)(、.*)?を除く'
また、1 のケースでは、NOT REGEXP の条件が '\((.*、)?(豆(類)?\(未)(、.*)?を除く' のため、「野菜類(豆類(未成熟)を除く)」を拾ってしまいます。最初の REGEXP の条件のように、検索語の末尾に '.*?' をつけて「'\((.*、)?(豆(類)?\(未).*?(、.*)?を除く」と展開する必要があります。さらに、今のままでは検索語が「豆類(未成熟)」の時に「豆類(未成熟、ただし○○を除く)」が拾えないので、下記のように REGEXP, NOT REGEXP いずれも閉じ括弧を「(\)|、)」または「\(?」と展開する必要があります。後者の方が汎用性が高いですね。開き括弧も「\(?」と '?' 付きに展開した方が良さそうです。
SELECT sakumotsu FROM m_sakumotsu WHERE concat('、', sakumotsu, betsumei) REGEXP '(^|、|\()(豆(類)?\(?未成熟\)?).*?(\)|、|$)' AND concat('、', sakumotsu, betsumei) NOT REGEXP '\((.*、)?(豆(類)?\(?未成熟\)?).*?(、.*)?を除く'
これで、豆類(未成熟)は問題なく検索できるようになりますが、もしかすると他の検索パターンで副作用が出るかもしれません。とりあえず、AcfUtil の作物名→正規表現展開ルーチンを修正してみてください。本題ですが、作物選択ダイアログボックスを追加/置換せずに閉じた場合、再検索をしないというのが一番良い解決策だと思います。あと、「豆類(未」のように不完全な作物名を手入力した後にダイアログボックスから追加する可能性を考慮すると、追加の場合は手入力時と同じ前方一致用の正規表現に展開する必要がありそうです。これまた、他の検索パターンで副作用が発生する可能性を否定できませんが…。
投票数:3
平均点:6.67
投稿ツリー
-
ACFinder 120519test版 (kabe, 2012.05.19 22:32)
-
Re: ACFinder 120519test版 (OhYeah!, 2012.05.20 16:09)
-
Re: ACFinder 120519test版 (kabe, 2012.05.21 20:29)
-
Re: ACFinder 120519test版 (OhYeah!, 2012.05.21 23:29)
-
Re: ACFinder 120519test版 (OhYeah!, 2012.05.28 18:00)
-
-
-
Re: ACFinder 120519test版 (kabe, 2012.05.21 20:59)
-
Re: ACFinder 120519test版 (OhYeah!, 2012.05.24 13:21)
-
Re: ACFinder 120519test版 (OhYeah!, 2012.05.24 15:25)
-
検索語の前処理 (OhYeah!, 2012.05.29 09:31)
-
Re: 検索語の前処理 (OhYeah!, 2012.05.29 18:20)
-
-
-
Re: ACFinder 120519test版 (OhYeah!, 2012.05.28 14:32)
-
Re: ACFinder 120519test版 (OhYeah!, 2012.05.28 16:21)
-
Re: ACFinder 120519test版 (OhYeah!, 2012.05.28 23:28)
-
-
-
-
-