C++ 用正则表达式在VC+中拆分字符串+;

C++ 用正则表达式在VC+中拆分字符串+;,c++,visual-c++,C++,Visual C++,我正在一个项目中使用VC++10。作为C/C++的新手,我刚在谷歌上搜索过,似乎在标准中?VC++10似乎有正则表达式。但是,如何进行正则表达式拆分?我需要提振吗 在网上搜索时,我发现很多人都推荐Boost做很多事情,比如标记化/拆分字符串、解析(PEG),现在甚至是正则表达式(虽然这应该是内置的…)。我能断定boost是必须的吗?它的180MB仅用于一些琐碎的事情,在许多语言中都得到了天真的支持。C++11标准已经实现。它还包括在。实际上,TR1从VS2008开始就可用,它隐藏在std::TR

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

在网上搜索时,我发现很多人都推荐Boost做很多事情,比如标记化/拆分字符串、解析(PEG),现在甚至是正则表达式(虽然这应该是内置的…)。我能断定boost是必须的吗?它的180MB仅用于一些琐碎的事情,在许多语言中都得到了天真的支持。

C++11标准已经实现。它还包括在。实际上,TR1从VS2008开始就可用,它隐藏在
std::TR1
名称空间下。所以VS2008或更高版本不需要Boost.Regex

可以使用
regex\u token\u迭代器执行拆分:

#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;
}
这是使用单字符分隔符时的示例。若分隔符本身可以是任何子字符串,那个么您需要执行一些更复杂的迭代器工作,并可能存储以前的令牌子匹配对象

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

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;
}
const std::string s(“生命和一切的意义”);
常量std::tr1::regex分隔符和str((-*)([^-]*)”;
const std::tr1::sregex_token_迭代器endOfSequence;
//分离器将是第0、第2、第4。。。代币
//真正的代币将是1、3、5。。。代币
int子匹配[]={1,2};
std::tr1::sregex_token_迭代器标记(s.begin()、s.end()、分隔符和str、子匹配);
while(令牌!=endOfSequence)
{
std::cout这里有一个来自

您将在
res

std::tr1::cmatch res;
str = "<h2>Egg prices</h2>";
std::tr1::regex rx("<h(.)>([^<]+)");
std::tr1::regex_search(str.c_str(), res, rx);
std::cout << res[1] << ". " << res[2] << "\n";
std::tr1::cmatch res;
str=“鸡蛋价格”;

STR:ReX RX((标准C++)有一个.oh,ic,但它的C++ 11,编译器支持什么?VC++是我应该用这个SCH赋值支持它的(正确的)?也就是说,我必须同意Boost是一个必备工具。如果您不在适当的地方使用它,您将只能重新实现它或使用劣质的解决方案。VC++10支持regex库的版本(请参阅),它(afaik)与C++11版本几乎相同。对于C++11,每个主要编译器的最新版本都支持所有主要功能,但并不统一提供(特别是针对旧平台时)在使用VisualStudio 2010对ReGEX使用之前,您可能想考虑MS基本上拒绝修复,甚至在2010的补丁中。显然,它是在WHO KE-NE-2011版中固定的,并且我只能推测它是固定在2012 +中的。MS对std库做过(也没有做过)的事情比这更让我恼火。你说的“拆分”是什么意思?类std::string有很多方法。可能你一开始就不需要正则表达式。谢谢,只缺少一部分,我能得到匹配的字符串吗?例如,如果我匹配
[=+{};]
我想知道匹配的字符是什么很好,但是你能解释一下
子匹配吗
?我看文档时没有更好的理解:(
子匹配是需要迭代的正则表达式组的索引数组。例如,如果你有正则表达式
(a)(b)(c)
并通过{2,3}对于
token\u迭代器
ctor,它将只迭代
(b)
(c)
组,并将它们视为单独的令牌。
(a)
组匹配将被跳过。还请注意,零索引对应于整个正则表达式。
std::tr1::cmatch res;
str = "<h2>Egg prices</h2>";
std::tr1::regex rx("<h(.)>([^<]+)");
std::tr1::regex_search(str.c_str(), res, rx);
std::cout << res[1] << ". " << res[2] << "\n";