我有一个这样的字符串:
string s ="one 1 two 2 three 3";
我想写一个正则表达式,这样当用户输入"一个"我打印1,如果输入为"两个" ...任何建议或帮助将非常感谢。
答案 0 :(得分:3)
抛弃注册表。写一些代码。使用
形式的东西int main()
{
std::map<std::string, int> m = {{"one", 1}, {"two", 2}, {"three", 3}};
std::string input;
std::cin >> input
std::cout << m[input];
}
注意花哨的初始化:从C ++ 11开始有效。
答案 1 :(得分:3)
非常简单:
std::string s = "one 1 two 2 three 3";
std::regex rx( "([a-z]+) (\\d+)" );
std::match_results< std::string::const_iterator > mr;
std::regex_search( s, mr, rx );
std::cout << mr.str( 1 ) << '\n'; // one
std::cout << mr.str( 2 ) << '\n'; // 1
以及整场比赛:
std::string temp = s;
while( std::regex_search( temp, mr, rx ) ){
std::cout << mr.str( 1 ) << '\n';
std::cout << mr.str( 2 ) << '\n';
temp = mr.suffix().str();
}
输出:
one
1
two
2
three
3
并最终:
std::string ui; //user_input
std::string temp = s;
while( std::regex_search( temp, mr, rx ) ){
std::getline( std::cin, ui );
if( ui == mr.str( 1 ) ){
std::cout << mr.str( 2 ) << '\n';
}
temp = mr.suffix().str();
}
注意:这不是一个完美的解决方案,因为regex_search
逐个匹配项目。因此,您应该输入one
然后two
然后three
测试
ideas $ ./temp
one
1
two
2
three
3
ideas $
可以随心所欲,但我只是为了学习它是如何工作的而写的:
std::string s = "one 1 two 2 three 3";
std::string ui; //user_input
std::getline( std::cin, ui );
std::string pt = "(" + ui + ")" + " ";
std::regex rx( pt + "(\\d)" );
std::match_results< std::string::const_iterator > mr;
std::regex_search( s, mr, rx );
if( ui == mr.str( 1 ) ){
std::cout << mr.str( 2 ) << '\n';
}
测试
ideas $ ./temp
one
1
ideas $ ./temp
two
2
ideas $ ./temp
three
3
ideas $