C ++正则表达式多行替换

时间:2011-03-20 11:51:48

标签: c++ regex boost

我再次寻求更多关于心灵的知识。

我有一个使用Boost库的C ++解决方案,因为解决方案需要在Linux环境中工作。但是我的知识是在C#中,而C ++是我潜入的一个新领域。

我正在寻找一个如何使用如何创建一个模板并通过正则表达式替换值的示例?

这是我正在谈论的一个例子:

<VirtualHost *:80>
    ServerName  {$1}.somedomain.com
    ServerAlias {$1}
    ServerAdmin mr.admin@somedomain.com

    <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.

理想情况下,一个函数/方法将能够处理这个,所以我可以通过说出一个存储库对象,然后通过它来渲染它。

非常感谢, 肖恩

1 个答案:

答案 0 :(得分:1)

实际上,你不需要正则表达式的强大功能,你可以使用find / replace。

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应该是一个包含整个模板并包含换行符的大字符串。