#2 Article 2104 Posted at 1994/12/04 11:55:14 by SysopMick'n (MAP001) [SEARCH]

Subject: Re: Re: bbs 検索機能のダイレクトコマンド /2103 /2098

書き方が悪かったですね^^;

>>  -key=KEYWORD
>「KEYWORDを含む文字列」って指定は出来ますか?

  -key=KEYWORD による指定がまさにそれです。

  たとえば、-key=CDE だと、ABCDE 、CDE 、CDEFG などのキーワードに
ひっかかります。

  - * -

>それから正規表現とは何ですか?

  「~なパターンの文字列」といった指定方法をするためのものです。

  たとえば、正規表現を使うと、
     例 1: 先頭が A で始まる文字列
     例 2: 先頭が A 、2 番目が任意の文字、3 番目が C である文字列を
           含む文字列
     例 3: NO.40 NO.41 NO.42 ~ NO.49 のどれか
     例 4: ABC または DEF を含む文字列
  といったものを指定することができます。

  egrep や sed などのコマンドでよく使われているものです。

  「ワイルドカード」というものをご存知かと思いますが、* や ? 以外に
「先頭」とか「~に属する文字」などの指定が可能になっているもの、と
考えるのもいいかもしれません。

  で、具体的に上記の 3 つの例を表わす正規表現は以下のようになります。

    例 1: ^A

           ^ は「文字列の先頭」を表わすものです。
           ^ABC だと、「先頭が ABC で始まる文字列」になります。
          また、$ を使って「文字列の最後」を指定することもできます。
          A$ だと、「最後が A である文字列」になります。

    例 2: A.C

          2 番目の . が「任意の文字」を表わすものです。
          DOS のコマンドラインでのワイルドカードの ? に相当します。
          じゃあ、. (ピリオド) という文字を特定するには? となりますが、
          これは、\. というように . の前に \ を置きます。\ によって、
          . が持つ特殊な意味を打ち消します。

    例 3: NO\.4[0-9]

          まず、NO\.4 までの部分で NO.40 や NO.41 などの先頭 4 文字を
          指定します。
          続く [0-9] が、「0 から 9 の範囲にある任意の一文字」を
          表わします。

          この [ ] は「~に属する文字」を表わします。

          [0123] のように文字を [ ] の中に並べると、0 または 1 または...
          という意味になりますす。[ABCDEFGHIJKLMN] などと指定すると、
          A から N までの任意の1文字になりますが、並べるのを省略して
          表わす方法として - を使うことができます。これにより [A-N] と
          略記可能です。

          [012A-Z] のように組み合わせることもできます。

          逆に、「~に属さない文字」を表わすこともできます。
          [^0123] のように [ の直後に ^ を続けると、0 でも 1 でも 2 でも 3
          でも「ない」任意の一文字の意味になります。

    例 4: ABC|DEF

          | によって「または」を表わします。

まとめると、

   ^        文字列の先頭
   $        文字列の最後
   .        任意の一文字
   [...]    ... 内の文字に属する任意の一文字
   [^...]   ... 内の文字に属さない任意の一文字
   |        「または」

となります。応用として、

  ^$                空文字列 (キーワードがついていないアーティクル)

  ^NO\.[0-9][0-9]$  NO.01 や NO.14 のみを検索、GNO.01 や GNO.14 は
                    検索しないようにする

bbs コマンドで使うには、

  bbs allread -key=/^AB/ #board ..

のように、正規表現を / と / で囲んで指定します。

  SysopMick'n (MAP001)

p.s.検索のバグ:

「ボード #xxx(ボード名)には、アーティクル No.1234はありません。」

といったエラーメッセージのようなものが出ることがありますが、これは、
「これ以上見つかりません」という意味で表示されています。深く気にせず、
「ああ、これ以上は見つからなかったんだな」と思って下さい(^^;)