【问题标题】:Splitting a QString until nth Comma拆分 QString 直到第 n 个逗号
【发布时间】:2013-12-16 17:01:18
【问题描述】:

我有一个格式类似于QString word = "123,12,1,"This is, a test";(从 CSV 文件中提取)的 QString。我想在每个逗号处拆分它,不包括最后一个单元格中字符串中的任何逗号。该列表类似于{"123", "12", "1", "\"This is, a test\""}

格式是一个最多 3 位的数字,然后是一个最多 2 位的数字,然后是一个最多 1 位的数字,然后是一个可以包含逗号的字符串。列表中应该总是有 4 个 QString。这是我正在尝试的方法

QString word = "123,12,1,\"This is, a test\"";
QStringList list = word.split( QRegExp( "(\\d+)," ) );

我从here 获得了此代码。此代码仅保存列表中的第 4 个 QString,前 3 个为空白。有人可以帮帮我吗?

【问题讨论】:

  • 由于您的要求有点复杂,我建议您简单地使用循环进行字符串解析。这样它会更加灵活和可读。
  • 在我的帖子下面添加了一个测试。另外,这个QString word = "123,12,1,"This is, a test"; 是如何在 C++ 中解析的?

标签: c++ regex qt


【解决方案1】:

这行得通吗?

编辑 - 这是一个小测试。

如果您没有得到预期的结果,那么您不能使用 QT 的拆分。
您应该在 while 循环中解析它以填充列表。

 QString str      = "\"123,12,1,\"This is, a test\"";
 QStringList list =
      str.split(
         QRegExp("(\"[^\"\\\\]*(?:\\\\[\\S\\s][^\"\\\\]*)*\"|\\d+)|,"),
         QString::SkipEmptyParts
      );

【讨论】:

  • 我测试它的那一行是这个(CSV 的第一行):1,1,9,"This is a sentencelist[0]1list[1]9,"This is a sentence。所以它跳过了第一个或第二个单元格,并将其他所有内容放在 list[1]
  • @maj0rtom - 我为你添加了一个测试。如果它有效,那就太好了。如果没有,就不能这样使用Qt的split。
  • 它有效,但它只将字符串(应该在cell[3] 中)保存在cell[0] 中。
  • @maj0rtom - 听起来行不通。在正则表达式中,定义了 3 个分隔符,只有 1 个是真正的分隔符。 2 不包含在捕获组内的交替中。大多数语言 split() 将使 captured 分隔符成为单独的列表项。否则,sep 不在列表中。所以 123,12,1,"This is, a test" 使用 (""|\d+)|, 通常拆分为 `['123','12','1','"This is, a test"']。没有其他方法可以拆分可能已嵌入 sep 的带引号的字符串(除非后处理)。如果你没有得到这样的列表,Qt 的拆分将无法解决这个问题。
【解决方案2】:

使用regexp sample,很容易研究出合适的模式:

在 QRegExp 构造函数中放置“转义模式”的上下文

【讨论】:

  • 所以我尝试了QStringList list = word.split( QRegExp( "(\\d+),(\\d+),(\\d+),(\\\".*\\\")" ) );,但这会将所有内容都放入列表[0]
  • 我认为您在 list[1]、list[2] 等中拥有所有捕获的模式。在 list[0] 中有整个匹配项。
  • list[1]list[2]list[3] 都超出范围。我还尝试了 captureText( ) 方式,这给了我错误。我也尝试使用与此处示例类似的捕获文本,但没有成功:qt-project.org/doc/qt-4.8/qregexp.html#capturedTexts
  • 好吧,capturedTexts 对我有用。我从未将 QString.split 与正则表达式一起使用,那么我上面的评论可能会产生误导。抱歉,我删除了我暗示 captureTexts 的 prious
【解决方案3】:

该正则表达式仅适用于数字。你应该使用类似的东西

QRegExp( "[A-Za-z\\d]+," )

【讨论】:

  • 当我使用这个时,list[0]、list[1]和list[2]仍然是空白的。
猜你喜欢
  • 2014-10-15
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
相关资源
最近更新 更多