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() 메서드는 정규식을 컴파일하거나 구성하는 데 사용됩니다. 정규식, 표현식 및 플래그가 필요합니다.

표현식은 문자열 유형이고 regex는 표현식이 일치하여 저장되는 메모리 영역에 대한 참조이며 플래그는 컴파일 종류를 식별하는 데 사용됩니다.

컴파일이 오류 없이 완료되면 값 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() 함수를 사용하여 문자열을 패턴과 비교할 수 있습니다. 몇 가지 매개변수를 고려합니다. 첫 번째는 미리 컴파일된 패턴, 찾을 패턴을 포함하는 문자열, 일치 위치에 대한 정보, 일치 동작의 변경을 설명하는 플래그입니다.

통사론:

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");
      }
    }
    
  • 이제 r1이라는 regex_t 유형 변수를 생성할 Main 함수를 생성합니다.
    regex_t r1;
    
  • data1, data2, data3이라는 반환 유형에 대해 세 개의 변수를 만듭니다.
    int data1;
    int data2;
    int data3;
    
  • 그런 다음 regEx를 만들고 패턴을 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