C ++从字符串中间提取数字

假账号

我有一个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); 
}

是否有更多简化的方法来做到这一点?如果是这样,他们是什么?

我纯粹是出于学习学习更好的代码的愿望,因为最终,上面的代码确实成功地提取了第一个数字,但看起来却是漫长而曲折的。

特雷弗·博伊德·史密斯

已针对C ++ 11更新

(对于编译器正则表达式支持的重要说明:对于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;
}

仅需C ++ 98的Boost解决方案

适用于许多字符串的最小实现示例(不仅仅是形式为“ 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

可以使用的其他示例字符串:

  • “ asdfasdf 45 sdfsdf”
  • “ X = 45,sdfsdf”

在此示例中,我在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章