我在使用C ++ 11 MSVC2013,我需要从文件名中提取一个数字,例如:
string filename = "s 027.wav";
如果我在Perl,Java或Basic中编写代码,我会使用正则表达式,这样的东西可以在Perl5中实现:
filename ~= /(\d+)/g;
我会在占位符变量$1
中输入数字“027”。
我也可以在C ++中这样做吗?或者你能建议一种不同的方法从该字符串中提取数字027吗?另外,我应该将生成的数字字符串转换为整数标量,我认为atoi()
是我需要的,对吗?
答案 0 :(得分:3)
您可以在C ++中执行此操作,从C ++ 11开始,使用regex
中的类集合。它与您在其他语言中使用的其他正则表达式非常相似。这是一个简单的例子,说明如何搜索您发布的文件名中的数字:
const std::string filename = "s 027.wav";
std::regex re = std::regex("[0-9]+");
std::smatch matches;
if (std::regex_search(filename, matches, re)) {
std::cout << matches.size() << " matches." << std::endl;
for (auto &match : matches) {
std::cout << match << std::endl;
}
}
就将027
转换为数字而言,您可以像前面提到的那样使用atoi
(来自cstdlib
),但这会存储值27
,而不是{ {1}}。如果您想保留027
前缀,我相信您需要将其保留为0
。上面的string
是sub_match
,因此,提取match
并转换为string
const char*
:
atoi
答案 1 :(得分:0)
好的,我解决了使用std :: regex,由于某种原因,我在尝试修改我在网络上找到的示例时无法正常工作。它比我想象的要简单。这是我写的代码:
#include <regex>
#include <string>
string FileName = "s 027.wav";
// The search object
smatch m;
// The regexp /\d+/ works in Perl and Java but for some reason didn't work here.
// With this other variation I look for exactly a string of 1 to 3 characters
// containing only numbers from 0 to 9
regex re("[0-9]{1,3}");
// Do the search
regex_search (FileName, m, re);
// 'm' is actually an array where every index contains a match
// (equally to $1, $2, $2, etc. in Perl)
string sMidiNoteNum = m[0];
// This casts the string to an integer number
int MidiNote = atoi(sMidiNoteNum.c_str());
答案 2 :(得分:0)
这是一个使用Boost的示例,替换正确的命名空间,它应该工作。
typedef std::string::const_iterator SITR;
SITR start = str.begin();
SITR end = str.end();
boost::regex NumRx("\\d+");
boost::smatch m;
while ( boost::regex_search ( start, end, m, NumRx ) )
{
int val = atoi( m[0].str().c_str() )
start = m[0].second;
}