2016-11-04 19 views
9

내 프로젝트에서 std::regex 함께 일하고 있습니다. 나는 컴파일 타임에 정규식을 알기 때문에 정규 표현식을 구축하는 것은 정규 표현식의 길이가 m 인 곳에서 O (2^m)에있다. 나는 컴파일 타임에 정규 표현식을 구축하고 싶다. 는 표준 : : 정규식이 가능합니까? (나는 basic_regex에 대한 constexpr의의 ctor를 참조 해달라고 때문에 나는 그렇게 생각하지 말아) 그리고하지 않을 경우 축적 컴파일 타임에 내 정규 표현식에이컴파일 타임 std :: regex 빌드

+0

개인적으로 나는 컴파일 시간, 시작 시간 및 런타임을 구별합니다. 기술적으로 시작 시간은 런타임입니다. 시작시에'regex'를 빌드합니다. – knivil

답변

5

우리는 구별 할 수있는 정규식 libary가 프로그램 컴파일과 정규식 컴파일 사이. 후자는 실제로 프로그램 런타임에서 수행되며 다양한 문자열에 대해 빠른 일치에 적합한 크고 효율적인 구조 (상태 시스템)를 구축하는 것을 의미합니다.

당신은 문자열의 정규식 개체를 구성 할 때 11 정규식, 정규식 컴파일이 완료 C++로

: 당신이 regex_match 이러한 객체, regex_search, regex_replace를 사용하는 경우

std::regex e (your_re_string); 

을, 당신은 작업의 장점을 이미 컴파일 된 정규식을 사용합니다. 따라서 프로그램 컴파일시 문자열을 알고 있다면 속도를 위해 할 수있는 최선의 방법은 프로그램 실행 당 한 번만 대응하는 정규식 객체를 생성하는 것입니다. 예를 들어 이니셜 라이저가있는 정적 변수로 어딘가에 선언되어 있습니다.

아마 당신이 원하는 것입니다.

일부 양식 regex_match, ...은 정규식 문자열로 즉시 작동 할 수 있습니다. 그러나 프로그래머가 보통 더 편리하기는하지만, 이것을 사용하면 성능이 불려질 때마다 정규 표현식 컴파일이 어려워 질 것입니다.

P. (1), Flex https://en.wikipedia.org/wiki/Flex_(lexical_analyser_generator) 또는 그와 비슷한 것) 과 같은 외부 정규 표현식/렉서 컴파일러 소프트웨어를 사용하십시오. (std::regex 객체를 컴파일하십시오. , 다음 serialize 및 C++ 입력 (실제로 DIY 버전의 (1)) 변환하지만 프로그램 실행 당 하나의 정규식 컴파일을 저장하기를 원한다면 가치가 없다고 저는 확신합니다. 아마 당신이 정말로 압도적 인 표현을 가지고 있지 않다면.

+2

답변 해 주셔서 감사합니다. 하지만 컴파일 할 때 nfa/dfa 정규식에 대한 가능한 빌드해야합니까? C++ 11과 constexpr을 사용하면 이것이 가능할 것이라고 생각합니다. – Exagon

+0

이론적으로는 그렇지만 constexpr 생성자를 작성하거나 추가 할 때까지 기다려야합니다. 2014 년 현재 C++ 14 또는 C++ 17에서 예상됩니다. 아직도 그것이 추가되었는지 모르겠습니다. 그렇지 않은 경우 기고 할 수 있습니다. 이것은 기술적 인 작업이지만 일부 연산자는 constexpr을 아직 지원하지 않을 수도 있습니다. C++ 표준은 항상 구현 전에 실행된다는 것을 기억하십시오. –

+0

그런 컴파일러가 필요하다면 "storeAsCPPSource (const regex &)"함수를 작성하고 객체를 컴파일하고 저장하는 간단한 응용 프로그램을 만들면됩니다. –

3

하나 Dusikova "Regular Expressions Redefined in C++”의 CppCon 2017 번개 토크는 정규식 문자열에 대해 사용자 정의 리터럴을 사용하는 컴파일 타임 정규식과 일치하는 함수를 생성하기위한 컴파일 타임 방식을 설명했습니다. code is on GitHub,하지만 아직 실험 및 현재 매우 유동적입니다. 그래서 컴파일 시간 정규 표현식이 아마 언젠가 곧 나타날 것 같습니다.