<regex>
라이브러리 (Microsoft Visual Studio 2012 : 업데이트 3)를 사용하여 응용 프로그램에 대해 약간 더 안전한로드 절차를 구현하고 몇 가지 치아가 발생했습니다 어려움 (참조 : Regular Expression causing Stack Overflow, Concurrently using std::regex, defined behaviour? 및 ECMAScript Regex for a multilined string 참조).Microsoft의 std :: regex 구현
정규식을 사용하여 (스택 오버 플로우 등을 발생시키는) 초기 문제가 발생했습니다. here이 제안되어 잘 작동합니다. 그러나 내 파일이 너무 크면 스택 오버플로가 발생합니다 (스택 커밋 및 예약 크기를 늘림으로써이를 피할 수 있음). 또는 스택 크기가 스택 오버플로가 발생하지 않을만큼 충분히 클 경우에는 std::regex_error
이 표시됩니다. 오류 코드 12 (error_stack)
. 여기
#include <iostream>
#include <string>
#include <regex>
std::string szTest = "=== TEST1 ===\n<Example1>:Test Data\n<Example2>:More Test Data\n<Example3>:Test\nMultiline\nData\n<Example4>:[email protected]\n<Example5>:\n=== END TEST1 ===\n=== TEST2 ===\n<Example1>:Test Data 2\n<Example2>:More Test Data 2\n<Example3>:Test\nMultiline\nData\n2\n<Example4>:[email protected]\n=== END TEST2 ===\n=== TEST3 ===\n<Example1>:Random Test Data\n<Example 2>:More Random Test Data\n<Example 3>:Some\nMultiline\nRandom\nStuff\n=== END TEST3 ===\n\
=== TEST1 ===\n<Example1>:Test Data (Second)\n<Example2>:Even More Test Data\n<Example3>:\n=== END TEST1 ===";
int main()
{
static const std::regex regexObject("=== ([^=]+) ===\\n((?:.|\\n)*)\\n=== END \\1 ===", std::regex_constants::ECMAScript | std::regex_constants::optimize);
for(std::sregex_iterator itObject(szTest.cbegin(), szTest.cend(), regexObject), end; itObject != end; ++itObject)
{
std::cout << "Type: " << (*itObject)[1].str() << std::endl;
std::cout << "Data: " << (*itObject)[2].str() << std::endl;
std::cout << "-------------------------------------" << std::endl;
}
}
스택 오버플로 예외가 발생 당할 것이다; 스택 크기 (8kB 커밋 및 2MB 예약)를 변경하면 std::regex_error
에 오류 코드 12 (error_stack)
가 발생합니다.
이러한 오류를 방지하기 위해 할 수있는 일이 있습니까? 아니면 정규식 라이브러리가 작은 문자열 (예 : DoB 검사 등)에서만 사용되도록 설계 되었습니까?
미리 감사드립니다.
고마워,이 모든 문제를 해결 한 것 같습니다! +1 –