正则表达式中的If-Then-Else条件并使用捕获组

时间:2010-01-13 15:59:53

标签: c++ regex boost

我在理解正则表达式中的if-then-else条件时遇到了一些困难。

阅读If-Then-Else Conditionals in Regular Expressions后,我决定写一个简单的测试。我使用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;

}

如果str_to_modify有“123”,我希望得到“123”,如果str_to_modify有“ttt”,我得到“000”。但是我在第一种情况下得到了“123123 | 000”而在第二种情况下没有得到任何结果。

请告诉我,请问,我的考试有什么问题?

第二个仍不起作用的例子:

#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 个答案:

答案 0 :(得分:4)

我认为格式字符串应该是(?1$1:000)中描述的regex_replace

编辑:我认为regex_match无法做到你想做的事。为什么不尝试以下方法呢? match[i].matched将告诉您匹配是否成功(或者您可以使用match.format检查第i个标记的子表达式是否匹配)。您可以使用#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; } } 成员函数格式化匹配。

{{1}}