IT

regex로 그룹을 캡처하려면 어떻게 해야 합니까?

itgroup 2023. 9. 15. 20:57
반응형

regex로 그룹을 캡처하려면 어떻게 해야 합니까?

regex를 사용해서 다른 문자열을 추출하려고 합니다.POSIX regex 기능을 사용하고 있습니다 (regcomp, regexec...), 그리고 나는 한 무리를 잡는데 실패합니다...

예를 들어, 패턴을 다음과 같이 단순한 것으로 두십시오."MAIL FROM:<(.*)>"
(함께)REG_EXTENDEDcflags)

나는 '<'와 '>' 사이의 모든 것을 포착하고 싶습니다.

내 문제는.regmatch_t전체 패턴의 경계를 제공합니다(MAIL FROM:<...>) 단지 괄호 사이에 있는 것이 아니라...

제가 무엇을 빠뜨리고 있나요?

미리 감사드립니다.

편집: 일부 코드

#define SENDER_REGEX "MAIL FROM:<(.*)>"

int main(int ac, char **av)
{
  regex_t regex;
  int status;
  regmatch_t pmatch[1];

  if (regcomp(&regex, SENDER_REGEX, REG_ICASE|REG_EXTENDED) != 0)
    printf("regcomp error\n");
  status = regexec(&regex, av[1], 1, pmatch, 0);
  regfree(&regex);
  if (!status)
      printf(  "matched from %d (%c) to %d (%c)\n"
             , pmatch[0].rm_so
             , av[1][pmatch[0].rm_so]
             , pmatch[0].rm_eo
             , av[1][pmatch[0].rm_eo]
            );

  return (0);
}

출력:

$./a.out "012345MAIL FROM:<abcd>$"
matched from 6 (M) to 22 ($)

솔루션:

RarrRarrRarr가 말했듯이, 지수는 실제로pmatch[1].rm_so그리고.pmatch[1].rm_eo
이런 이유로regmatch_t pmatch[1];된다regmatch_t pmatch[2];
그리고.regexec(&regex, av[1], 1, pmatch, 0);된다regexec(&regex, av[1], 2, pmatch, 0);

감사합니다 :)

다음은 여러 그룹을 캡처하는 것을 보여주는 코드 예제입니다.

그룹 '0'이 전체 매치이고, 그 다음 그룹이 괄호 안의 부분임을 알 수 있습니다.

이렇게 하면 소스 문자열의 첫 번째 일치만 캡처됩니다.다음은 여러 그룹을 여러 매치로 캡처한 버전입니다.

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

int main ()
{
  char * source = "___ abc123def ___ ghi456 ___";
  char * regexString = "[a-z]*([0-9]+)([a-z]*)";
  size_t maxGroups = 3;

  regex_t regexCompiled;
  regmatch_t groupArray[maxGroups];

  if (regcomp(&regexCompiled, regexString, REG_EXTENDED))
    {
      printf("Could not compile regular expression.\n");
      return 1;
    };

  if (regexec(&regexCompiled, source, maxGroups, groupArray, 0) == 0)
    {
      unsigned int g = 0;
      for (g = 0; g < maxGroups; g++)
        {
          if (groupArray[g].rm_so == (size_t)-1)
            break;  // No more groups

          char sourceCopy[strlen(source) + 1];
          strcpy(sourceCopy, source);
          sourceCopy[groupArray[g].rm_eo] = 0;
          printf("Group %u: [%2u-%2u]: %s\n",
                 g, groupArray[g].rm_so, groupArray[g].rm_eo,
                 sourceCopy + groupArray[g].rm_so);
        }
    }

  regfree(&regexCompiled);

  return 0;
}

출력:

Group 0: [ 4-13]: abc123def
Group 1: [ 7-10]: 123
Group 2: [10-13]: def

regmatch_t 구조의 pmatch 배열의 0번째 요소에는 일치하는 전체 문자열의 경계가 포함됩니다.예제에서는 하위 식을 사용하여 문자열 일치에 대한 정보를 얻기 위해 인덱스 0이 아닌 인덱스 1의 regmatch_t에 관심이 있습니다.

도움이 더 필요한 경우 실제 작은 코드 샘플을 포함하도록 질문을 편집하여 사용자가 문제를 쉽게 찾을 수 있도록 하십시오.

언급URL : https://stackoverflow.com/questions/2577193/how-do-you-capture-a-group-with-regex

반응형