2012-08-11 2 views
4

RE2은 Google에서 구할 수있는 현대적인 정규 표현 엔진입니다. 현재 gnuregex를 사용하고있는 프로그램에서 RE2를 사용하고 싶습니다. 내가 가진 문제는 무엇이 일치하는지 알아내는 것과 관련이있다. RE2가 반환하는 것은 일치하는 문자열입니다. 일치하는 부분의 오프셋을 알아야합니다. 현재 내 계획은 RE2가 반환하는 것을 취한 다음 C++ 문자열에 find을 사용하는 것입니다. 그러나 이것은 낭비적인 것처럼 보인다. 나는 RE2 매뉴얼을 훑어 보았고 그것을하는 법을 알 수 없다. 어떤 아이디어?RE2를 사용하여 일치하는 문자열의 오프셋을 찾는 방법은 무엇입니까?

답변

9

결과를 std::string 대신 re2::StringPiece에 저장하십시오. .data() 값은 원래 문자열을 가리 킵니다.

이 프로그램을 고려하십시오. 각 테스트에서 result.data()은 원래 const char* 또는 std::string에 대한 포인터입니다.

#include <re2/re2.h> 
#include <iostream> 


int main(void) { 

    { // Try it once with character pointers 
    const char *text[] = { "Once", "in", "Persia", "reigned", "a", "king" }; 

    for(int i = 0; i < 6; i++) { 
     re2::StringPiece result; 
     if(RE2::PartialMatch(text[i], "([aeiou])", &result)) 
     std::cout << "First lower-case vowel at " << result.data() - text[i] << "\n"; 
     else 
     std::cout << "No lower-case vowel\n"; 
    } 
    } 

    { // Try it once with std::string 
    std::string text[] = { "While", "I", "pondered,", "weak", "and", "weary" }; 

    for(int i = 0; i < 6; i++) { 
     re2::StringPiece result; 
     if(RE2::PartialMatch(text[i], "([aeiou])", &result)) 
     std::cout << "First lower-case vowel at " << result.data() - text[i].data() << "\n"; 
     else 
     std::cout << "No lower-case vowel\n"; 
    } 
    } 
} 
+0

내가 필요한 것. 감사. 설명서에 있었습니까? 나는 그것을 찾지 못할 것이다. – vy32

+0

명시 적으로 나열된 답변을 찾지 못했지만 http://code.google.com/p/re2/source/browse/re2/re2.h#290에서 추측 할 수있었습니다. –

+1

캡처 괄호를 추가하기 위해 정규식을 수정할 수 없다는 점을 제외하고는 똑같이해야합니다. 이 경우 부분 일치의 위치를 ​​어떻게 알 수 있습니까? – Pavel

관련 문제