[Namazu-devel-ja 810] Re: [Namazu-users-ja 580] Re: 正規表現の「D」が小文字に変換されて意図した検索ができない

Tadamasa Teranishi yw3t-trns @ asahi-net.or.jp
2005年 12月 27日 (火) 17:06:14 JST


寺西です。

# とりあえず、HEAD 用です。

Tadamasa Teranishi wrote:
> 
> 対処方法としては、正規表現検索式の場合、'\' の後の文字については
> 大文字/小文字変換をしないという簡単なもので十分でしょう。

ということで、正規表現検索式の中の '\' の後は、英小文字変換をしない
nmz_regex_strlower を作成し、これを使うことにしました。

> # ついでに別のバグも見つけてしまいました。

単語検索式あるいはフレーズ検索式の中身をわかち書きした後、それぞれ
が単語検索、フレーズ検索になるか再度調べ直す必要があるのですが、
これに detect_search_mode() を使ってしまっています。
このため、フレーズ検索式の中に正規表現検索式や部分一致検索式を
書いた場合に誤認識します。

例えば、

   {/Nam.*/}

とすると、/Na..../ で正規表現検索が働いてしまいます。

   {/Nam.*/ Manual}

だと、/Nam.*/ や Manual を単語検索した上でフレーズ検索処理を
行います。
フレーズ検索では1つ以上の単語検索の組合せを仮定しているので、
やはり、前者の場合も /Nam.*/ という単語として処理を行うべき
でしょう。
そのため、detect_search_mode() は、やめて分かち書きの区切りの
'\t'が含まれる場合は、フレーズ検索、それ以外は全て単語検索
と判定するようにしました。

# cvs diff search.c
Index: search.c
===================================================================
RCS file: /storage/cvsroot/namazu/nmz/search.c,v
retrieving revision 1.104
diff -u -p -r1.104 search.c
--- search.c    15 Nov 2005 08:14:58 -0000      1.104
+++ search.c    27 Dec 2005 07:43:08 -0000
@@ -104,6 +104,7 @@ static void remove_quotes(char *str);
 static enum nmz_stat normalize_idxnames(void);
 static int issymbol ( int c );
 static void escape_meta_characters(char *expr, size_t bufsize);
+static void nmz_regex_strlower(char *str);

 /*
  * Show the status for debug use
@@ -1118,9 +1119,9 @@ nmz_do_searching(const char *key, NmzRes

     strncpy(tmpkey, key, BUFSIZE - 1);

-    nmz_debug_printf("before nmz_strlower: [%s]", tmpkey);
-    nmz_strlower(tmpkey);
-    nmz_debug_printf("after nmz_strlower:  [%s]", tmpkey);
+    nmz_debug_printf("before nmz_regex_strlower: [%s]", tmpkey);
+    nmz_regex_strlower(tmpkey);
+    nmz_debug_printf("after nmz_regex_strlower:  [%s]", tmpkey);

     mode = detect_search_mode(tmpkey);
     if (mode == ERROR_MODE) {
@@ -1137,7 +1138,11 @@ nmz_do_searching(const char *key, NmzRes
                return val;
            }
            /* Re-examine because tmpkey is wakatied. */
-           mode = detect_search_mode(tmpkey);
+            if (strchr(tmpkey, '\t')) {
+                mode = PHRASE_MODE;
+            } else {
+                mode = WORD_MODE;
+            }
        }
     }

@@ -1184,3 +1189,26 @@ nmz_free_hitnums(struct nmz_hitnumlist *
     }
 }

+static void nmz_regex_strlower(char *str)
+{
+    if (strlen(str) >= 2 && *str == '/' && str[strlen(str) - 1] == '/')
{
+        if (nmz_is_regex_searchmode()) {
+            /* keep \W \S \D \A \Z \B \G */
+            char bak = '\0';
+
+            while (*str) {
+                if (bak != '\\') {
+                    /* Using ascii dependent lower same as mknmz.  */
+                    bak = *str = _nmz_tolower(*str);
+                } else {
+                    bak = '\0';
+                }
+                str++;
+            }
+        } else {
+            nmz_strlower(str);
+        }
+    } else {
+        nmz_strlower(str);
+    }
+}
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns @ asahi-net.or.jp
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E




Namazu-devel-ja メーリングリストの案内