2011-11-07 3 views
12

POSIX regex 라이브러리와 PCRE 라이브러리의 정규식 함수를 살펴 보았지만 두 함수 모두 문자열 교체 기능이없는 것 같습니다. 저는 C++을 사용하고 싶지 않습니다. 다른 라이브러리를 연결할 필요가 없다면 가장 좋을 것입니다.하지만 할 수는 있습니다. 수동으로 문자열 바꾸기를 수행해야합니까? 그렇다면 캡처 그룹을 어떻게 사용할 수 있습니까?순수 C에서 정규식 문자열 바꾸기를 수행하는 방법?

+0

어떤 캡처 그룹을 언급하고 있습니까? regex에 내장 된 C 라이브러리가 없기 때문에 pcre 또는 somithing을 사용해야합니다. – lvella

+0

일반적으로 C 문자열 내에 문자열 바꾸기를 수행 할 수 없습니다. 사용 가능한 메모리가 없을 수 있습니다. 정확히 무엇을하려고하는지 명확히 할 수 있습니까? –

+0

그럼 내가 구체적으로하고 싶니? 내가 변경하고 서버에 전달하는 정규식을 사용하려는 HTTP 요청 헤더가 있습니다. – Yifan

답변

20

regex.h는 문자열 대체를 기본적으로 지원하지 않지만 하위 표현식/캡처 그룹을 제공하므로 훨씬 쉽게 사용할 수 있습니다. 정규 표현식 컴파일에 익숙하고 정규 표현식 실행과 서브 표현식을 생략한다고 가정합니다. regex.h 다음과 같이

regexec는()이 정의된다 (은/usr// 등), 둘째, 최종 인수 정규식이다

extern int regexec (const regex_t *__restrict __preg, 
     const char *__restrict __string, size_t __nmatch, 
     regmatch_t __pmatch[__restrict_arr], 
     int __eflags); 

제, 문자열과 실행 플래그 실행될 로 나타났다. 세 번째와 네 번째 인수는 regmatch_t 배열을 지정하는 데 사용됩니다. regmatch_t는 rm_so와 rm_eo라는 두 개의 필드로 구성되며, 각각 일치하는 영역의 시작과 끝의 인덱스 또는 오프셋입니다. 이 인덱스는 문자열 바꾸기를 수행하기 위해 문자열 .h의 memcpy(), memset()memmove()과 함께 사용할 수 있습니다.

나는 약간의 예를 만들고 나중에 게시 할 것이다.

행운을 빌어 요, 그리고 이것이 도움이 되었기를 바랍니다.

+0

+1 이렇게 대답하면 308 명이 넘습니다! –

+4

* 작은 예제를 만들고 나중에 게시 할 예정입니다. * 언제? 5 년 전에이 약속을하셨습니다. ; ([여기 있습니다] (http://stackoverflow.com/questions/1085083/regular-expressions-in-c-examples) 지금까지 찾은 몇 가지 예제 –

5

PCRE 라이브러리 자체는 바꾸기 기능을 제공하지 않지만 perl 스타일 =~ s/pattern/replace/ 구문을 허용하는 PCRE 다운로드 페이지에서 사용할 수있는 래퍼 기능이 있으며 PCRE 기본 기능을 사용하여 대체/바꾸기를 수행합니다. http://www.pcre.org/으로 이동하여 다운로드 링크 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/을 클릭 한 다음 Contrib 디렉토리를 클릭하십시오. 원하는 패키지/프로젝트는 pcrs-0.0.3-src.tar.gz입니다.

나는이 문서를 사용하지 않았으므로 문서가 얼마나 잘 작동하는지 증언 할 수 없다. 그러나 코드는 상당히 작고 단순한 코드이므로 목적을 잘 수행 할 수 있습니다.

+0

안녕하세요, 링크 주셔서 감사합니다.하지만 어떻게합니까? 내 프로그램에서 pcrs를 사용합니까? 나는 현재 pcre_compile 및 pcre_exec 함수를 사용합니다. http://stackoverflow.com/a/1421923/1729501 – user13107

관련 문제