C 言語での正規表現

Muhammad Zeeshan 2023年10月12日
  1. C 言語での正規表現
  2. C で regcomp() メソッドを使用して正規表現を作成する
  3. C の regexec() メソッドを使用して、文字列をコンパイル済み正規表現と比較する
C 言語での正規表現

この記事では、例とともに C の正規表現を取り上げます。

C 言語での正規表現

文字列で構成される正規表現を使用して、検索パターンを見つけることができます。文字列照合および他の同様のアプリケーションは、それを広範囲に使用します。

これらは、パターンシーケンスを文字シーケンスと照合するための標準化されたアプローチです。C、C++、Java、および他の多くの主要なプログラミング言語がそれを使用します。

正規表現について学習した後、POSIX 固有のライブラリパターンをいくつか見てみましょう。

  • 角かっこで囲まれた文字または数字は、[] を使用すると簡単に検索できます。
  • [:number:] を使用して、任意の番号を見つけることができます。
  • [:word:] は、文字、数字、およびアンダースコアを検索できます。
  • [:lower:] は、アルファベットの小文字を見つけるために使用されます。

C で regcomp() メソッドを使用して正規表現を作成する

正規表現 regcomp() メソッドは、正規表現をコンパイルまたは作成するために使用されます。正規表現、式、およびフラグが必要です。

式は文字列型であり、正規表現は式が一致して保存されるメモリ領域への参照であり、フラグはコンパイルの種類を識別するために使用されます。

コンパイルがエラーなしで完了した場合は、値 0 を返します。また、式を正常にコンパイルできない場合は、エラーコードが出力されます。

構文:

regcomp(&regex, expression, flag)

例:

  • 正規表現タイプの変数を作成し、r1 のように名前を付けます。
    regex_t r1;
    
  • 次に、以下に示すように、正規表現生成プロセスの結果を保持する変数を作成する必要があります。
    int regval;
    
  • 関数を呼び出して正規表現を生成します。
    regval = regcomp(&r1, "[:word:]", 0);
    
  • Regular Expression compiled successfully. はコンパイルプロセスの後に表示されます。
    if (value == 0) {
      printf("Regular Expression compiled successfully.");
    }
    
  • それ以外の場合は、An Error Occurred. というメッセージとともに例外がスローされます。
    else {
      printf("An Error Occurred.");
    }
    

完全なソースコード:

#include <regex.h>
#include <stdio.h>

int main() {
  regex_t r1;
  int regval;
  regval = regcomp(&r1, "[:word:]", 0);
  if (regval == 0) {
    printf("Regular Expression compiled successfully.");
  } else {
    printf("An Error Occurred.");
  }
  return 0;
}

出力:

Regular Expression compiled successfully.

C の regexec() メソッドを使用して、文字列をコンパイル済み正規表現と比較する

regexec() 関数を使用して、文字列をパターンと比較することができます。いくつかのパラメーターを考慮します。1つ目は、プリコンパイルされたパターン、検索するパターンを含む文字列、一致の場所に関する情報、および一致の動作の変更を説明するフラグです。

構文:

regexec(&regex, expression, 0, NULL, 0);

一致する場合は値 0 を返し、一致しない場合は REG NOMATCH を返します。

例:

  • まず、結果を表示する DisplayPattern という名前の関数を作成します。値が 0 の場合、Pattern found と表示されます。0 に等しくない場合は、単に Pattern not found. と表示されます。それ以外の場合は、An error occurred. というメッセージとともにエラープロンプトが表示されます。
    void DisplayPattern(int val) {
      if (val == 0) {
        printf("Pattern found.\n");
      } else if (val == REG_NOMATCH) {
        printf("Pattern not found.\n");
      } else {
        printf("An error occurred.\n");
      }
    }
    
  • 次に、Main 関数を作成します。ここで、r1 という名前の regex_t 型変数を作成します。
    regex_t r1;
    
  • data1data2data3 という名前の戻りタイプの 3つの変数を作成します。
    int data1;
    int data2;
    int data3;
    
  • 次に、正規表現を作成し、パターンを reg の文字列と比較します。
    data1 = regcomp(&r1, " I am a writing c language", 0);
    data1 = regexec(&r1, "Hi there its me Zeeshan", 0, NULL, 0);
    
  • 以下に示すように、さらにいくつかの regEx を追加し、パターンを reg の文字列と比較します。
    data2 = regcomp(&r1, "I am a writing c language", 0);
    data2 = regexec(&r1, " Lets do coding", 0, NULL, 0);
    
    data3 = regcomp(&r1, "My Name is Zeeshan Khan", 0);
    data3 = regexec(&r1, " My Name is Zeeshan Khan", 0, NULL, 0);
    
  • 最後に、前に作成した DisplayPattern 関数を使用してパターンを表示します。
    DisplayPattern(data1);
    DisplayPattern(data2);
    DisplayPattern(data3);
    

完全なソースコード:

#include <regex.h>
#include <stdio.h>

void DisplayPattern(int val) {
  if (val == 0) {
    printf("Pattern found.\n");
  } else if (val == REG_NOMATCH) {
    printf("Pattern not found.\n");
  } else {
    printf("An error occurred.\n");
  }
}

int main() {
  regex_t r1;
  int data1;
  int data2;
  int data3;
  data1 = regcomp(&r1, " I am a writing c language", 0);
  data1 = regexec(&r1, "Hi there its me Zeeshan", 0, NULL, 0);

  data2 = regcomp(&r1, "I am a writing c language", 0);
  data2 = regexec(&r1, " Lets do coding", 0, NULL, 0);

  data3 = regcomp(&r1, "My Name is Zeeshan Khan", 0);
  data3 = regexec(&r1, " My Name is Zeeshan Khan", 0, NULL, 0);

  DisplayPattern(data1);
  DisplayPattern(data2);
  DisplayPattern(data3);
  return 0;
}

出力:

Pattern not found.
Pattern not found.
Pattern found.
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn