regcomp() — 正規表現のコンパイル

フォーマット

#include <regex.h>
int regcomp(regex_t *preg, const char *pattern, int cflags);

言語レベル

XPG4

スレッド・セーフ

はい

ロケール依存

この関数の振る舞いは、現行ロケールの LC_CTYPE カテゴリーおよび LC_COLLATE カテゴリーの影響を受ける可能性があります。この関数は、コンパイル・コマンドに対して LOCALETYPE(*CLD) が指定されている場合には使用できません。詳細については、CCSID およびロケールの理解を参照してください。

説明

regcomp() 関数は、pattern が指すソースの正規表現を実行可能なバージョンにコンパイルし、 それを preg が指すロケーションに保管します。 その後で、regexec() 関数を使用して、正規表現をその他のストリングと比較することができます。

cflags フラグは、次のコンパイル・プロセスの属性を定義します。
cflag ストリングの説明
REG_ALT_NL
  • LOCALETYPE(*LOCALE) が指定されている場合は、 統合ファイル・システムの改行文字が正規表現と一致します。
  • LOCALETYPE(*LOCALEUTF) が指定されている場合は、データベースの改行文字が一致します。
REG_ALT_NL フラグが設定されていない場合、LOCALETYPE(*LOCALE) のデフォルトがデータベースの改行に一致し、 LOCALETYPE(*LOCALEUTF) のデフォルトが統合ファイル・システムの改行に一致します。
注: UTF-8 および UTF-32 の場合、統合ファイル・システムの改行文字とデータベースの改行文字は同じです。
REG_EXTENDED 拡張正規表現をサポートします。
REG_NEWLINE 改行文字を特別な行末文字として扱います。 次に、] および $ パターンと一致する行の境界を設定し、明示的に \n を使用するストリング内でのみ一致します。 (このフラグを省略した場合、改行文字はその他の文字と同様に扱われます。)
REG_ICASE 照合で大/小文字を区別しません。
REG_NOSUB pattern に指定された副次式の数を無視します。 ストリングをコンパイル済みパターンと比較する場合 (regexec() を使用) は、 ストリングがパターン全体に一致しなければなりません。 次に、regexec() 関数は、一致が見つかったかどうかのみを示す値を戻します。 この値は、ストリング内のどのポイントから一致が開始するか、 あるいは一致するストリングが何であるかは示しません。

正規表現は、コンテキストから独立した構文で、幅広い文字セットと文字セットの配列を表します。 これは、現在のロケールによって、さまざまに解釈されます。 関数 regcomp()regerror()regexec()、および regfree() は、 UNIX awk、ed、grep、 および egrep の各コマンドと同様な方法で正規表現を使用します。

戻り値

regcomp() 関数は、正常終了した場合は 0 を戻します。 それ以外の場合はエラー・コードを戻します (このエラー・コードは regerror() 関数への呼び出しで使用できます)。 また、preg の内容は予期できません。

#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
   regex_t    preg;
   char       *string = "a very simple simple simple string";
   char       *pattern = "¥¥(sim[a-z]le¥¥) ¥¥1";
   int        rc;
   size_t     nmatch = 2;
   regmatch_t pmatch[2];
 
   if (0 != (rc = regcomp(&preg, pattern, 0))) {
      printf("regcomp() failed, returning nonzero (%d)¥n", rc);
      exit(EXIT_FAILURE);
   }
 
   if (0 != (rc = regexec(&preg, string, nmatch, pmatch, 0))) {
      printf("Failed to match '%s' with '%s',returning %d.¥n",
             string, pattern, rc);
   }
   else {
      printf("With the whole expression, "
             "a matched substring ¥"%.*s¥" is found at position %d to %d.¥n",
             pmatch[0].rm_eo - pmatch[0].rm_so, &string[pmatch[0].rm_so],
             pmatch[0].rm_so, pmatch[0].rm_eo - 1);
      printf("With the sub-expression, "
             "a matched substring ¥"%.*s¥" is found at position %d to %d.¥n",
             pmatch[1].rm_eo - pmatch[1].rm_so, &string[pmatch[1].rm_so],
             pmatch[1].rm_so, pmatch[1].rm_eo - 1);
   }
   regfree(&preg);
   return 0;
 
   /****************************************************************************
      The output should be similar to :
 
      With the whole expression, a matched substring "simple simple" is found
      at position 7 to 19.
      With the sub-expression, a matched substring "simple" is found
      at position 7 to 12.
   ****************************************************************************/
}