包含在std :: regex搜索中,使用std :: regex_token_iterator从std :: sub_match中排除

时间:2018-06-21 13:54:56

标签: c++ regex c++11

我想使用空格字符作为分隔符来标记std::string,但是在一对引号之间不应考虑任何分隔符,也不应使用其他引号。为此,我使用以下regex表示为原始字符串文字):

R"((\"[^\"]*\")|\S+)"

用作std::regexstd::sregex_token_iterator时会给出以下输出:

测试样本 [Try It Online]:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>

int main() {
   std::string text = "Quick \"\"\"\" \"brown fox\".";
   std::regex re(R"((\"[^\"]*\")|\S+)");
   std::copy(std::sregex_token_iterator(text.cbegin(), text.cend(), re, 0),
             std::sregex_token_iterator(),
             std::ostream_iterator<std::string>(std::cout, "\n"));
}

测试输出

Quick
""
""
"brown fox"
.

这导致子匹配中包含周围的引号。相反,我想摆脱这些周围的报价。为此,我显然可以手动修改迭代子匹配项,但是我想知道是否有可能以及如何使用std::regexstd::sregex_token_iterator消除周围的引号?

变更日志:感谢YSC,我使正则表达式最小化/减少了。

1 个答案:

答案 0 :(得分:1)

也许是这样:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>

int main() {
   std::string text = "Quick \"\"\"\" \"brown fox\".";
   std::regex re(R"((\"([^\"]*)\")|(\S+))");
   std::transform(
       std::sregex_iterator(text.cbegin(), text.cend(), re),
       std::sregex_iterator(),
       std::ostream_iterator<std::string>(std::cout, "\n"),
       [](const std::smatch& m) { return m[2].length() ? m[2] : m[3]; });
}

Demo