Next: , Previous: Regular Expressions, Up: Searching and Matching


33.3 正規表現の探索

GNU Emacsでは、正規表現に一致するつぎの部分を インクリメンタルにもそうでなくも探せます。 インクリメンタルサーチコマンドについては、 正規表現探索を 参照してください。 ここでは、プログラムで有用な探索関数のみについて述べます。 基本的なものはre-search-forwardです。

これらの探索関数は、バッファがマルチバイトであれば 正規表現をマルチバイトに変換します。 バッファがユニバイトであれば、正規表現をユニバイトに変換します。 See Text Representations

— コマンド: re-search-forward regexp &optional limit noerror repeat

この関数は、カレントバッファにおいて前方へ向けて 正規表現regexpに一致するテキストの文字列を探索する。 関数はregexpに一致しないテキストはすべて飛び越え、 みつけた一致箇所の末尾へポイントを置く。 ポイントの新たな値を返す。

limitnil以外(カレントバッファ内の位置であること)であると、 探索の上限を表す。 その位置を越える箇所での一致は受け入れない。

repeatを指定してあると(正の数であること)、 その回数だけ探索を繰り返す(一致箇所の末尾を新たな探索の開始位置とする)。 連続してこれらの探索に成功すると関数は成功し、 ポイントを移動してその新たな値を返す。 さもなければ探索は失敗である。

関数が失敗した場合の動作は、noerrorの値に依存する。 noerrornilであると、 エラーsearch-failedを通知する。 noerrortであると、 re-search-forwardはなにもせずにnilを返す。 noerrornilでもtでもないと、 re-search-forwardはポイントをlimit(あるいはバッファの末尾)へ 移動してnilを返す。

つぎの例では、ポイントは始めは‘T’のまえにある。 探索を呼び出すと、ポイントは当該行の末尾 (‘hat’の‘t’と改行のあいだ)へ移動する。

          ---------- Buffer: foo ----------
          I read "-!-The cat in the hat
          comes back" twice.
          ---------- Buffer: foo ----------
          
          (re-search-forward "[a-z]+" nil t 5)
               ⇒ 27
          
          ---------- Buffer: foo ----------
          I read "The cat in the hat-!-
          comes back" twice.
          ---------- Buffer: foo ----------
— コマンド: re-search-backward regexp &optional limit noerror repeat

この関数は、カレントバッファにおいて後方へ向けて 正規表現regexpに一致するテキストの文字列を探索し、 みつけた一致箇所の先頭へポイントを置く。

この関数はre-search-forwardに類似したものであるが、 単純な鏡像ではない。 re-search-forwardは、一致箇所の先頭が 開始位置に可能な限り近い一致箇所を探す。 re-search-backwardが完全な鏡像であれば、 一致箇所の末尾が可能な限り近い一致箇所を探す。 しかし、実際には、一致箇所の先頭が可能な限り近い一致箇所を探す。 これは、正規表現との一致をとる処理は、 指定開始位置において先頭から末尾へ向けてつねに行われるからである。

re-search-forwardの完全な鏡像には、 正規表現の一致を末尾から先頭へ向けて行う特別な機能が必要である。 それを実装する手間をかけるほどの価値はない。

— Function: string-match regexp string &optional start

この関数は、文字列stringにおいて正規表現regexpに一致した 最初の箇所の添字を返す。 あるいは、一致がなければnilを返す。 startnil以外であると、 stringの指定した添字から探索を始める。

たとえばつぎのとおりである。

          (string-match
           "quick" "The quick brown fox jumped quickly.")
               ⇒ 4
          (string-match
           "quick" "The quick brown fox jumped quickly." 8)
               ⇒ 27

文字列の最初の文字の添字は0であり、 2番目の文字の添字は1であるといった具合になる。

この関数から戻ったあとでは、 一致箇所を越えた最初の文字の添字は(match-end 0)で得られる。 see Match Data

          (string-match
           "quick" "The quick brown fox jumped quickly." 8)
               ⇒ 27
          
          (match-end 0)
               ⇒ 32
— Function: looking-at regexp

この関数は、カレントバッファ内のポイントの直後のテキストが 正規表現regexpに一致するかどうかを調べる。 ここで『直後』とは、開始位置は固定されていて、 ポイントのうしろの最初の文字で始まる場合にのみ探索は成功する。 結果は、一致すればtであり、さもなければnilである。

この関数はポイントを移動しないが、マッチデータを更新する。 match-beginningmatch-endを使ってマッチデータを参照できる。

つぎの例では、ポイントは‘T’の直前にある。 ポイントがこれ以外の場所にあると結果はnilになる。

          ---------- Buffer: foo ----------
          I read "-!-The cat in the hat
          comes back" twice.
          ---------- Buffer: foo ----------
          
          (looking-at "The cat in the hat$")
               ⇒ t