C 言語での正規表現

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

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

C 言語での正規表現

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

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

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

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

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

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

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

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

構文:

C
 cCopyregcomp(&regex, expression, flag)

例:

完全なソースコード:

C
 cCopy#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;
}

出力:

 textCopyRegular Expression compiled successfully.

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

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

構文:

C
 cCopyregexec(&regex, expression, 0, NULL, 0);

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

例:

完全なソースコード:

C
 cCopy#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;
}

出力:

 textCopyPattern not found.
Pattern not found.
Pattern found.
チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
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