C++ 正则表达式和占位符

C++ RegExp and placeholders

我在C++11 MSVC2013上,我需要从文件名中提取一个数字,例如:

string filename = "s 027.wav";

如果我用 Perl、Java 或 Basic 编写代码,我会使用正则表达式,类似这样的东西在 Perl5 中可以解决问题:

filename ~= /(\d+)/g; 

我会在占位符变量 中得到数字“027”。

我也可以在 C++ 中执行此操作吗?或者你能建议一种不同的方法来从该字符串中提取数字 027 吗?另外,我应该将生成的数字字符串转换为整数标量,我认为 atoi() 是我需要的,对吧?

您可以在 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,不是 027。如果你想保留 0 前缀,我相信你需要将其保留为 stringmatch 上面是 sub_match 所以,提取 string 并转换为 const char* for atoi:

int value = atoi(match.str().c_str());

好的,我使用 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 , , , etc. in Perl)
string sMidiNoteNum = m[0]; 

// This casts the string to an integer number
int MidiNote = atoi(sMidiNoteNum.c_str());

这是一个使用 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;
}