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

Skipping blank lines when reading line delimited list of strings

本文关键字:列表 字符串 分隔 读取      更新时间:2023-10-16

我正在尝试使用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

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

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

我将参考 提升精神船长问题 了解更多背景。快速笔记:

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仍保留内部空格

科里鲁现场观看

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

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

科里鲁也看到