gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:00:01 25 4
gpt4 key购买 nike

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

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

用作 std::regex 时给出以下输出的 std::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::regex 消除周围的引号。和 std::sregex_token_iterator

变更日志:由于 YSC,我最小化/减少了正则表达式.

最佳答案

也许是这样的:

#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

关于c++ - 包含在 std::regex 搜索中,使用 std::regex_token_iterator 从 std::sub_match 中排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50970331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com