C ++ регулярных выражений многострочная замена - PullRequest
1 голос
/ 20 марта 2011

Я снова стремлюсь к знаниям.

У меня есть решение на C ++, в котором используются библиотеки Boost, так как оно требует работы в среде 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 Ответ

1 голос
/ 20 марта 2011

На самом деле вам не нужны возможности регулярных выражений, вы можете сделать это с помощью команды 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 должна быть большой строкой, содержащей весь шаблон с переносами строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...