Условные операторы If-Then-Else в регулярных выражениях и использование группы захвата - PullRequest
1 голос
/ 13 января 2010

У меня есть некоторые трудности в понимании условных выражений в регулярных выражениях.

После прочтения Условных выражений If-Then-Else в регулярных выражениях Я решил написать простой тест. Я использую C ++, Boost 1.38 Regex и MS VC 8.0.

Я написал эту программу:

#include <iostream>
#include <string>
#include <boost/regex.hpp>

int main()
{
    std::string str_to_modify = "123";
    //std::string str_to_modify = "ttt";
    boost::regex regex_to_search ("(\\d\\d\\d)");
    std::string regex_format ("(?($1)$1|000)");

    std::string modified_str = 
         boost::regex_replace(
           str_to_modify, 
           regex_to_search, 
           regex_format, 
           boost::match_default | boost::format_all | format_no_copy );

    std::cout << modified_str << std::endl;

    return 0;

}

Я ожидал получить "123", если str_to_modify имеет "123", и получить "000", если у меня str_to_modify есть "ttt". Однако я получаю 123123 000 в первом случае и ничего во втором.

Coluld, скажи мне, пожалуйста, что не так с моим тестом?

Второй пример, который все еще не работает:

#include <iostream>
#include <string>
#include <boost/regex.hpp>

int main()
{
    //std::string str_to_modify = "123";
    std::string str_to_modify = "ttt";
    boost::regex regex_to_search ("(\\d\\d\\d)");
    std::string regex_format ("(?1foo:bar");

    std::string modified_str = 
        boost::regex_replace(str_to_modify, regex_to_search, regex_format, 
            boost::match_default | boost::format_all | boost::format_no_copy );

    std::cout << modified_str << std::endl;

    return 0;

}

1 Ответ

4 голосов
/ 13 января 2010

Я думаю, что строка формата должна быть (?1$1:000), как описано в документах Boost.Regex .

Редактировать: Я не думаю, что regex_replace может делать то, что вы хотите. Почему бы вам не попробовать следующее? regex_match сообщит вам, было ли совпадение успешным (или вы можете использовать match[i].matched, чтобы проверить, совпадает ли i-ое теговое подвыражение). Вы можете отформатировать совпадение, используя функцию-член match.format.

#include <iostream>
#include <string>
#include <boost/regex.hpp>

int main()
{
    boost::regex regex_to_search ("(\\d\\d\\d)");

    std::string str_to_modify;
    while (std::getline(std::cin, str_to_modify))
    {
        boost::smatch match;
        if (boost::regex_match(str_to_modify, match, regex_to_search))
            std::cout << match.format("foo:$1") << std::endl;
        else
            std::cout << "error" << std::endl;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...