C ++ : 어떤 정규식 라이브러리를 사용해야합니까? [닫은]


107

저는 리눅스 기반 시스템에서 실행되는 상용 (오픈 소스가 아닌) C ++ 프로젝트를 진행하고 있습니다. C ++ 코드 내에서 몇 가지 정규식을 수행해야합니다. (알아요 : 이제 두 가지 문제가 있습니다.)

질문 : C / C ++에서 정규식을 정기적으로 수행하는 사람들은 어떤 라이브러리를 살펴볼 것을 권장합니까? 빠른 검색을 통해 다음 사항에 주목했습니다.

1) Boost.Regex (Boost 소프트웨어 라이선스를 읽어야하지만이 질문은 소프트웨어 라이선스에 관한 것이 아닙니다)

2) C (C ++ 아님) POSIX 정규식 (#include <regex.h>, regcomp, regexec 등)

3) http://freshmeat.net/projects/cpp_regex/ (나는 이것에 대해 아무것도 모른다; GPL 인 것 같아서이 프로젝트에서 사용할 수 없다)


20
누군가가 힌트를 위해이 오래된 질문을보고 있다면 ... 최근에 언급 할 가치가있는 새 라이브러리가 나타났습니다. Google의 RE2 : code.google.com/p/re2
Stéphane

2
이것은 새로운 PCRE2 (PCRE의 수정 된 버전) 라이브러리에 대한 C ++ 래퍼입니다.
Jahid

답변:


80

Boost.Regex 는 매우 훌륭하며 C ++ 0x 표준의 일부가 될 예정입니다 (이미 TR1에 있음).

개인적으로 Boost.Xpressive를 사용하는 것이 훨씬 더 좋습니다 . 헤더 전용 라이브러리이며 정적 정규식 (컴파일 시간에 컴파일 된 정규식)과 같은 멋진 기능이 있습니다.

업데이트 : C ++ 11 호환 컴파일러 (gcc 4.8은 NOT!)를 사용 하는 경우 다른 것을 사용할 합당한 이유가없는 한 std :: regex 를 사용하십시오.


4
Boost는 버그로 가득 차 있으며 코딩 표준 및 QA 프로세스가 부족한 것으로 보입니다. 프로덕션 소프트웨어에는 적합하지 않습니다. 여기에는 C (C ++가 아닌)를 장소에서 사용하고 sprintf와 같은 안전하지 않은 함수로 인한 버퍼 오버플로를 포함하는 Regex 기어가 포함됩니다. 감사 후 여러 버그를보고했을 때보고 후 몇 달이 지나도 "알려지지 않은"상태로 남아있었습니다. 자신의 책임하에 사용하십시오.
jww

8
거의 5 년 후, 오늘 std :: regex를 사용하려고 시도했지만 아직 GCC에서 구현되지 않은 것으로 나타났습니다. stackoverflow.com/questions/15671536/…
Stéphane

2
사용하지 않을 표준에 : 그 문제에 대한 정규식 또는 부스트 :: 정규식 좋은 이유가 부스트 :: 정규식 될 것이라고 주위 RE2보다 느린 10 배
아르센 Zahray

3
@jww 아니요, C ++ 표준 (C ++ 03 TR, C ++ 11 및 C ++ 1y)은 여러 부스트 라이브러리를 표준통합 하기로 결정했습니다 . 즉, 모든 실용적인 목적을 위해 Boost 표준을 만들었 습니다. "아마도"와 같은 족제비 단어를 사용하여 증거없이 주장을하고 인신 공격을 사용하는 것은 부스트의 상당 부분이 이제 C ++라는 사실을 바꾸는 데 아무런 영향을 미치지 않으며 C ++의 현대적인 방향을 정의하는 많은 사람들도 부스트 작업을하고 있습니다.
Alice

3
@Alice-C 및 C ++위원회는 표준을 만듭니다. 그들은 라이브러리를 통합하지 않습니다. 나는 그들이 도서관을 생산하는 것을 알지 못합니다.
jww

22

모든 제안에 감사드립니다.

저는 오늘 몇 가지를 시도해 보았고 우리가하려는 작업으로 다른 타사 라이브러리를 다운로드 할 필요가없는 가장 간단한 솔루션을 선택했습니다. 결국 나는 #include <regex.h>를 사용하고 표준 C POSIX 호출 regcomp () 및 regexec ()를 사용했습니다. C ++는 아니지만, 이것이 가장 쉬운 방법임이 증명되었습니다.


19

과거 C ++ 프로젝트에서는 PCRE 를 성공적으로 사용했습니다. 많은 유명 프로젝트에서 사용되기 때문에 매우 완벽하고 잘 테스트되었습니다. 그리고 Google이 최근 PCRE 용 C ++ 래퍼 세트도 제공 한 것을 확인했습니다.


16

C ++에는 TR1 이후 내장 정규식 라이브러리가 있습니다. AFAIK Boost의 정규식 라이브러리는 이와 매우 호환되며 표준 라이브러리가 TR1을 제공하지 않는 경우 대체로 사용할 수 있습니다.


TR1에는 어떤 컴파일러가 있습니까? g ++ 4.1.2 (Debian Etch)의 사본은 #include <regex>를 지원하지 않지만 TR1을 주목 해 주셔서 감사합니다. TR1 및 C ++ 0x에 대해 더 알고 싶은 다른 사람들은 en.wikipedia.org/wiki/Technical_Report_1
Stéphane

SP1부터 Visual Studio 2008에는 정규식을 포함하여 대부분의 TR1이 있습니다. Linux에서는 도움이되지 않는다는 것을 알고 있지만 다른 사람들이 관심을 가질 수 있습니다. Dinkumware는 gcc에서 TR1도 지원합니다.
Michael Burr

내가 쓴 것처럼 std 라이브러리에 정규식이 없으면 boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…을
Kasprzol

3
g ++ 4.5.0. TR1은 tr1 / regex에 있습니다. 예 : #include <tr1 / regex>
Ogre Psalm33

11

두 가지 추가 옵션 :

C ++ 11로 작성할 수있는 경우 -튜토리얼 수행 : http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

참고 : 내가 아는 유일한 c ++ 11 정규식 라이브러리는 clang / llvm one 이며 Mac에서만 작동합니다. GNU는 아직 정규식을 구현하지 않습니다 . Visual Studio에 대해 모르겠습니다. 대부분의 사람들은 여전히 부스트 정규식 구현을 사용합니다 .


또는 ragel 을 사용하여 유한 상태 머신을 생성하여 구문 분석을 수행하고 C / C ++ 코드 구현을 생성 할 수 있습니다 . http://www.complang.org/ragel/

json을 구문 분석하는 코드를 생성하는 데 약간 사용했습니다. 이 ragel 파일 : https://github.com/matiu2/yajp/blob/master/parser/number.rl 은이 코드를 생성하는 데 사용됩니다. https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 및이 유한 상태 머신 다이어그램 :

상태 다이어그램


업데이트 1 :

lvm의 libc ++ regex는 ubuntu 14.04에서 작동합니다. libc ++-dev-LLVM C ++ 표준 라이브러리 (개발 파일). 컴파일 할 때 :clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

업데이트 2 :

저는 현재 부스트 스피릿 3을 즐기고 있습니다. BNF 스타일 규칙이 있고 잘 생각되어 있기 때문에 정규식보다 더 좋아합니다. (이전 (더 많은 문서화) Spirit Qi libs 여기에서 찾았습니다 )




6

저는 개인적으로 항상 boost.regex를 사용했습니다 (C ++에서 정규식이 많이 필요하지는 않지만). Microsoft Labs에는 GRETA ( http://research.microsoft.com/projects/greta/) 라는 정규식 라이브러리도 있습니다 . 분명히 그것은 매우 빠르고 전체 Perl 5 구문을 특징으로합니다. 나는 그것을 사용하지 않았지만 그것을 테스트하고 싶을 수도 있습니다.


8
GRETA ( research.microsoft.com/en-us/downloads/… )는 Eric Niebler가 Microsoft에서 근무할 때 (GRETA의 헤더 파일에서 1998-2001 년) 만들었습니다. Eric Niebler는 2007 Boost.Xpressive에서 제작했습니다. 사람들은 Boost.Xpressive가 "Microsoft Research 최종 사용자 라이선스 계약"보다 더 새롭고 더 좋은 라이선스를 가지고 있기 때문에 사용해야합니다.
Cristian Adam

1
죄송합니다. Boost 라이브러리를 가져 오는 것이 얼마나 좋은지 모르겠습니다. 마지막으로 로컬 다운로드 비 압축 버전의 boost를 확인한 것은 400 메가입니다. 부스트로 얻는 inain 템플릿 광기는 말할 것도 없습니다. 죄송합니다. Gregs 답변을 권장합니다.
Chad


@Chad boost는 많은 상황에서 도움이되는 잘 알려진 표준 라이브러리 세트이기 때문에? 다운로드 크기가 너무 크면 BCD를 사용하여 필요하지 않은 항목을 제거하십시오. 이러한 방식으로 제거하면 boost.regex는 매우 작습니다.
Alice


1

여기 아무도 C ++ 0x와 함께 제공되는 것에 대해 아무 말도하지 않았습니다. C ++ 0x를 지원하는 컴파일러와 STL을 사용하는 경우 프로젝트에 다른 lib를 사용하는 대신 사용할 수 있습니다.


1
가장 많이 득표 한 답변 (2 년 이상 전)을 보면이를 언급합니다.
Mateen Ulhaq 2011
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.