我在理解正则表达式中的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;
}
答案 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}}