gpt4 book ai didi

c++ - 读取以行分隔的字符串列表时跳过空行

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:37 24 4
gpt4 key购买 nike

我正在尝试使用 boost::spirit 解析一个简单的文本文件。文本文件是一个以行分隔的字符串列表。我可以让它大部分工作,但涉及到空白行时除外,我想跳过它。

我尝试了几种方法,但要么在空行处停止解析,要么我的结果中包含了空行。

有没有办法告诉我的语法跳过空行?

代码

std::ifstream ifs("one.txt");
ifs >> std::noskipws;

std::vector< std::string > people;

if (parse(
istream_iterator(ifs),
istream_iterator(),
*(as_string[+print >> (eol | eoi)]),
people))
{
std::cout << "Size = " << people.size() << std::endl;

for (auto person : people)
{
std::cout << person << std::endl;
}
}

一个.txt

Sally
Joe
Frank
Mary Ann

Bob

我得到了什么

Sally
Joe
Frank
Mary Ann

我想得到什么

Sally
Joe
Frank
Mary Ann
Bob

奖励:我可以同时从语法中的行中去除前导或尾随空格吗?我当然需要保留 Mary Ann 的空间。

最佳答案

if (qi::phrase_parse(
first, last,
-qi::as_string[qi::lexeme[+(qi::char_ - qi::eol)]] % qi::eol,
qi::blank,
people))

我会引用 Boost spirit skipper issues 了解更多背景。快速笔记:

if (qi::phrase_parse(
// ^ ----- use a skipper to parse phrases whith a skipper (`qi::blank` here)
first, last,
-qi::as_string[qi::lexeme[+(qi::char_ - qi::eol)]] % qi::eol,
// | | | ^---- 1.
// +---- 2. | +---- 4.
// 5. ----v 3. ----+
qi::blank,
people))
  1. 匹配由换行符分隔的项目列表
  2. '-' 使项目可选(忽略空行)
  3. lexeme 在子表达式中包含空格(但它仍然会预先跳过,因此只有空格的行算作空行;如果您不想,请使用 no_skip预先发生)
  4. + 需要至少 1 个匹配项,因此空名称不被视为名称
  5. blank skipper 跳过空格,但不跳过换行符;这是因为换行符对您的语法很重要。还要注意 lexeme 仍然保留内部空白

查看 Live On Coliru

更新 作为对该评论的回应,增加的复杂性是由于跳过了空格。如果您愿意事后修剪空格,请务必使用

if (parse(first, last, - as_string[+(char_ - eol)] % eol, people))

查看 Live On Coliru 还有

关于c++ - 读取以行分隔的字符串列表时跳过空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26902755/

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