regex로 그룹을 캡처하려면 어떻게 해야 합니까?
regex를 사용해서 다른 문자열을 추출하려고 합니다.POSIX regex 기능을 사용하고 있습니다 (regcomp, regexec
...), 그리고 나는 한 무리를 잡는데 실패합니다...
예를 들어, 패턴을 다음과 같이 단순한 것으로 두십시오."MAIL FROM:<(.*)>"
(함께)REG_EXTENDED
cflags)
나는 '<'와 '>' 사이의 모든 것을 포착하고 싶습니다.
내 문제는.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(®ex, SENDER_REGEX, REG_ICASE|REG_EXTENDED) != 0)
printf("regcomp error\n");
status = regexec(®ex, av[1], 1, pmatch, 0);
regfree(®ex);
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(®ex, av[1], 1, pmatch, 0);
된다regexec(®ex, 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(®exCompiled, regexString, REG_EXTENDED))
{
printf("Could not compile regular expression.\n");
return 1;
};
if (regexec(®exCompiled, 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(®exCompiled);
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
'IT' 카테고리의 다른 글
이런 C/C++ 농담은 이해가 안 돼요. (0) | 2023.09.20 |
---|---|
Git Submodule 포인터를 포함하는 저장소에 저장된 커밋으로 되돌리는 방법은 무엇입니까? (0) | 2023.09.20 |
싱글 페이지 애플리케이션이 블로그에 적합합니까? (0) | 2023.09.15 |
MySQL 5.7로 덤프 파일 가져오기 (0) | 2023.09.15 |
.Net에 URL validator가 있습니까? (0) | 2023.09.15 |