2013-06-15 2 views
0

GLSL 쉐이더 코드를위한 프로세서를 작성하려고합니다. 코드를 분석하고 각 쉐이더에 대해 처리해야하는 입력과 출력을 동적으로 결정할 수있게 해줍니다.왜 여러 정규식 일치가 발생합니까?

이를 달성하기 위해 OpenGL을 통해 컴파일하기 전에 일부 정규식을 사용하여 셰이더 코드를 구문 분석하기로 결정했습니다.

정규식이 예상대로 작동하는지 확인하는 테스트 코드를 작성했습니다.

코드 :

#include <iostream> 
#include <string> 
#include <regex> 

using namespace std; 

int main() 
{ 

string strInput = "  in vec3 i_vPosition; "; 
smatch match; 
// Will appear in regex as: 
// \bin\s+[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*(\[[0-9]+\])?\s*; 
regex rgx("\\bin\\s+[a-zA-Z0-9]+\\s+[a-zA-Z0-9_]+\\s*(\\[[0-9]+\\])?\\s*;"); 

bool bMatchFound = regex_search(strInput, match, rgx); 

cout << "Match found: " << bMatchFound << endl; 

for (int i = 0; i < match.size(); ++i) 
{ 
    cout << "match " << i << " (" << match[i] << ") "; 
    cout << "at position " << match.position(i) << std::endl; 
} 

} 

유일한 문제는 위의 코드는 하나가 아닌 두 개의 결과를 생성하는 것입니다. 결과 중 하나가 비어 있지만.

출력 :

Match found: 1 
match 0 (in vec3 i_vPosition;) at position 6 
match 1() at position 34 

내가 궁극적으로 내가 입력으로 전체 파일을 제공 할 때 여러 결과를 생성 할,하지만 난 일관성있는 결과를 처리 할 수 ​​있도록 약간의 일관성을 좀하고 싶습니다 방법.

내가 예상 한 결과가 여러 개인 이유는 무엇입니까?

+3

어떤 컴파일러를 사용하고 있습니까? VC++ 10은 같은 결과를 주지만 GCC 4.7.2는'rgx'를 인스턴스화 할 때'std :: regex_error'를 던졌습니다. –

+0

VC++ 10을 사용하고 있습니다. – BlazeCell

답변

2

귀하의 정규식은 1 개 이상의 숫자를 둘러싼 대괄호 포함됩니다 역 참조

(\[[0-9]+\])? 

가 포함되어있는 것 같습니다,하지만? 선택 사항으로 만듭니다. 정규식, 선두를 적용하고 후행 공백은

[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s* 

하여 문자열의 나머지 부분 일치하는

\s+ ... \s* 

에 의해립니다 그리고 역 참조 비트는 빈 문자열과 일치합니다. ? 같은 : 당신은, 선택적으로 그 비트를 포함하지만, 역 참조로 반환하지 문자열 일치가 수동으로 확인하려면

\bin\s+[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*(?:\[[0-9]+\])?\s* 
+0

달콤한! 그것은 그것을 고쳤다. 고맙습니다! – BlazeCell

0

을 나는 궁극적으로 복수의 결과

를 생성 할

regex_search는 완전한 정규 표현식의 첫 번째 일치만을 찾습니다. 원본 텍스트에서 완전한 정규식이 일치하는 다른 위치를 찾으려면 regex_search를 반복해서 실행해야합니다. 반복적으로 검색을 실행하는 예제는 "C++ Regex to match words without punctuation" 을 참조하십시오.

위의 코드는 하나가 아닌 두 개의 결과를 생성합니다.

혼란스럽지 않습니까?

정규식

\bin\s+[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*(\[[0-9]+\])?\s*; 

둥근 괄호를 포함한다(). 둥근 괄호는 "그룹"즉 "하위 표현식"을 만듭니다. 하위 표현식은 선택 사항이므로 "(....)?", 하위 표현식이 실제로 아무것도 일치하지 않는 경우에도 전체 표현식이 일치 할 수 있습니다. 하위식이 다른 것과 일치하지 않으면 해당 하위 식의 값이 빈 문자열입니다. "캡처 괄호"및 "캡처하지 않는 괄호"에 대한 자세한 내용은 "Regular-expressions: Use Round Brackets for Grouping"을 참조하십시오. documentation for regex_search에 따르면

,

  • match.size()
  • match[0]
  • 은 전체 정규 표현식과 일치하는 소스 문자열의 일부이며, 하위 표현식에 1을 더한 수입니다.
  • match[1]은 정규 표현식 내의 첫 번째 하위 표현식과 일치하는 소스 문자열의 일부입니다.
  • match[n]은 정규 표현식에서 n 번째 하위 표현식과 일치하는 소스 문자열의 일부입니다.

위 예제와 같이 1 개의 하위 표현식 만있는 정규 표현식은 항상 2의 match.size()를 반환합니다. 정규 표현식에 대해 하나는 일치하고, 표현식 - 하위 표현식이 실제로 어떤 것과도 일치하지 않아서 빈 문자열입니다.

관련 문제