IT

C ++ : 어떤 정규식 라이브러리를 사용합니까?

lottoking 2020. 8. 10. 07:31
반응형

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


저는 리눅스 기반 시스템에서 실행되는 상용 (오픈 소스가 아닌) 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 인 것 같아서이 프로젝트에서 사용할 수 없다)


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

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

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


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

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


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


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


두 가지 추가 옵션 :

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는 우분투 14.04에서 작동합니다. libc ++-dev-LLVM C ++ 표준 라이브러리 (개발 파일). 할 때 :clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

업데이트 2 :

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


부스트에는 정규식 이 있습니다.

청구서를 채워야합니다


또한 엄청난 양의 데이터에 대해 수천 개의 패턴을 빠르게 일치시키기 위해 Yandex 검색 엔진 에서 개발 된 빠른 정규식 라이브러리볼 수 있습니다 .


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


해당 상황에 직면하여 Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx를 사용했습니다.


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

참고 URL : https://stackoverflow.com/questions/181624/c-what-regex-library-should-i-use

반응형