在VC++中通过regex拆分字符串

Jie*_*eng 0 c++ visual-c++

我在一个项目中使用VC++ 10.作为C/C++的新手,我只是谷歌搜索,似乎在标准C++中没有正则表达式?VC++ 10似乎有正则表达式.但是,我如何进行正则表达式拆分?我是否需要提升?

在网上搜索,我发现许多人推荐使用Boost进行许多操作,标记/拆分字符串,解析(PEG),现在甚至是正则表达式(尽管这应该是内置的......).我能否得出结论提升是必须的?它的180MB只是琐碎的东西,在许多语言中天真地支持?

Ros*_*ost 7

C++ 11标准有std::regex.它也包括在内TR1 for Visual Studio 2010.实际上TR1从VS2008开始可用,它隐藏在std::tr1命名空间下.因此,VS2008或更高版本不需要Boost.Regex.

可以使用regex_token_iterator以下方式执行拆分:

#include <iostream>
#include <string>
#include <regex>

const std::string s("The-meaning-of-life-and-everything");
const std::tr1::regex separator("-");
const std::tr1::sregex_token_iterator endOfSequence;

std::tr1::sregex_token_iterator token(s.begin(), s.end(), separator, -1);
while(token != endOfSequence) 
{
   std::cout << *token++ << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果您还需要获取分隔符本身,您可以从sub_match指向的对象获取它token,它是包含令牌的开始和结束迭代器的对.

while(token != endOfSequence) 
{
   const std::tr1::sregex_token_iterator::value_type& subMatch = *token;
   if(subMatch.first != s.begin())
   {
      const char sep = *(subMatch.first - 1);
      std::cout << "Separator: " << sep << std::endl;
   }

   std::cout << *token++ << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这是具有单个字符分隔符的情况的示例.如果分隔符本身可以是任何子字符串,则需要执行一些更复杂的迭代器工作,并可能存储先前的标记子匹配对象.

或者您可以使用正则表达式组并将分隔符放在第一组中,将真实标记放在第二组中:

const std::string s("The-meaning-of-life-and-everything");
const std::tr1::regex separatorAndStr("(-*)([^-]*)");
const std::tr1::sregex_token_iterator endOfSequence;

// Separators will be 0th, 2th, 4th... tokens 
// Real tokens will be 1th, 3th, 5th... tokens 
int subMatches[] = { 1, 2 };
std::tr1::sregex_token_iterator token(s.begin(), s.end(), separatorAndStr, subMatches);
while(token != endOfSequence) 
{
   std::cout << *token++ << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

不确定它是100%正确,但只是为了说明这个想法.