我有一个vector
包含strings
下面的格式text_number-number
例如: Example_45-3
我只想要第一个数字(45
在示例中),而我当前的代码无能为力:
std::vector<std::string> imgNumStrVec;
for(size_t i = 0; i < StrVec.size(); i++){
std::vector<std::string> seglist;
std::stringstream ss(StrVec[i]);
std::string seg, seg2;
while(std::getline(ss, seg, '_')) seglist.push_back(seg);
std::stringstream ss2(seglist[1]);
std::getline(ss2, seg2, '-');
imgNumStrVec.push_back(seg2);
}
是否有更多简化的方法来做到这一点?如果是这样,他们是什么?
我纯粹是出于学习学习更好的代码的愿望,因为最终,上面的代码确实成功地提取了第一个数字,但看起来却是漫长而曲折的。
(对于编译器正则表达式支持的重要说明:对于gcc。您需要4.9或更高版本。我在g ++ 4.9 [1]和9.2版上对此进行了测试。cppreference.com在我使用的浏览器编译器中具有此功能。)
感谢用户@ 2b-t在c ++ 11代码中发现错误!
这是C ++ 11代码:
#include <iostream>
#include <string>
#include <regex>
using std::cout;
using std::endl;
int main() {
std::string input = "Example_45-3";
std::string output = std::regex_replace(
input,
std::regex("[^0-9]*([0-9]+).*"),
std::string("$1")
);
cout << input << endl;
cout << output << endl;
}
适用于许多字符串的最小实现示例(不仅仅是形式为“ text_45-text”的字符串):
#include <iostream>
#include <string>
using namespace std;
#include <boost/regex.hpp>
int main() {
string input = "Example_45-3";
string output = boost::regex_replace(
input,
boost::regex("[^0-9]*([0-9]+).*"),
string("\\1")
);
cout << input << endl;
cout << output << endl;
}
控制台输出:
Example_45-3
45
可以使用的其他示例字符串:
在此示例中,我在Linux#include <boost/regex.hpp>
和上使用g ++ -lboost_regex
。您也可以使用C ++ 11x正则表达式。
如果您有更好的正则表达式,请随时编辑我的解决方案。
评论:
如果没有性能限制,则使用Regex非常适合此类事情,因为您无需重新发明轮子(通过编写一堆字符串分析代码,这需要花费一些时间来编写/测试)。
另外,如果/当您的字符串变得更复杂或具有更多不同的模式时,正则表达式可以轻松地适应复杂性。(问题的示例模式很容易。但是,通常情况下,当一行正则表达式执行相同的操作时,更复杂的模式将占用10-100余行代码。)
[1]
[1]显然<regex>
,对g ++版本4.9.x和2015年6月26日实现并发布了对C ++ 11的完全支持。对SO问题#1和#2的提示,指出了编译器版本必须为4.9.x。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句