2011-03-20 4 views
1

나는 마음에 대해 더 많은 지식을 다시 찾는다.C++ 정규 표현식 multiline replace

Linux 환경에서 작동해야하는 솔루션으로서 Boost 라이브러리를 사용하는 C++ 솔루션이 있습니다. 그러나 내 지식은 C#에 있고 C++은 내가 뛰어 들었던 다소 새로운 영역이다.

나는 다소 템플릿을 만들고 regex를 통해 값을 대체하는 방법에 대한 예제 사용을 찾고 있습니까?

<VirtualHost *:80> 
    ServerName {$1}.somedomain.com 
    ServerAlias {$1} 
    ServerAdmin [email protected] 

    <Location /> 
     DAV svn 
     SVNPath /some/dir/{$2}/{$3}/{$4} 
     AuthType Basic 
     AuthName "{$5}" 
     AuthUserFile /some/dir/{$2}/{$3}/{$4}/{$4}.users 
     Require valid-user 
    </Location> 
</VirtualHost> 

그리고 값의 키 : 여기

내가 무슨 말을하는지의 예 {이미 포맷 된 단지로 교체하는 데 필요한 $ n을의}

$1 = sub domain alias (3 characters long) 
$2 = is either "public" or "private" 
$3 = a users username (no more than 25 characters) 
$4 = the svn project name (no more than 30 characters and " " replaced with "_") 
$5 = the actual repository name given by the user. 

이상적인 기능/방법으로 이것을 처리 할 수있을 것입니다. 따라서 저장소 객체를 통해 전달하고이를 통해 렌더링 할 수 있습니다.

많은 감사, 숀 사실

+0

XML 스타일 템플릿과 비슷하지만 거의 비슷합니까? 아이디어 나 요구 사항입니까? 왜냐하면 ... 그건 끔찍한 생각이야. – Tomalak

+1

안녕하세요 Tomalak, 불행히도 요구 사항입니다. 나는 아직 미친 것처럼 뭔가를 생각해내는 것이 정신 나간 사람이 아니다. 위의 svn에 대한 활성화 된 모드를 사용하여 아파치 VirtualHost입니다. 건배, Shaun – shauny

답변

1

, 당신은 대체/당신이 발견으로 할 수있는 정규 표현식의 힘이 필요하지 않습니다.

void replaceall(string& source, const string& pattern, const string& replacement) 
{ 
    int curr = 0; 
    while ((curr = str.find(pattern, curr)) != string::npos) 
     str.replace(curr, parrern.length(), replacement); 
} 

void substitutetemplate(
     const string& subDomainAlias, 
     bool publicOrPrivate, 
     const string& userName, 
     const string& svnProjectName, 
     const string& repositoryName) 
{ 
    string result = m_template; 

    replaceall(result, "{$1}", subDomainAlias); 

    string pop = publicOrPrivate ? "public" : "private"; 
    replaceall(result, "{$2}", pop); 

    replaceall(result, "{$3}", userName); 

    string svnProjectNameWithoutSpaces = svnProjectName; 
    replaceall(svnProjectNameWithoutSpaces, " ", "_"); 
    replaceall(result, "{$4}", svnProjectNameWithoutSpaces); 

    replaceall(result, "{$5}", repositoryName); 
    m_result = result; 
} 

m_template은 줄 바꿈이있는 전체 템플릿을 포함하는 큰 문자열이어야합니다.

+0

환상적인 코드 작품. 건배 Vlad :) – shauny

+0

@ shauny : 당신은 환영합니다! – Vlad