2010-01-13 48 views
1

在理解正則表達式中的if-then-else條件時遇到一些困難。正則表達式中的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; 

} 

我希望得到 「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; 

} 

回答

4

我覺得格式字符串應該是(?1$1:000)Boost.Regex docs描述。

編輯:我不認爲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; 
    } 
} 
+0

謝謝,現在如果'str_to_modify'有「123」,一切正常。但是,如果'str_to_modify'有「ttt」,我仍然沒有得到我的預期。我會發布我的第二個例子。 – 2010-01-13 16:27:45