【问题标题】:How to split QString based on a given character length?如何根据给定的字符长度拆分 QString?
【发布时间】:2019-02-19 13:07:04
【问题描述】:

我正在尝试根据每组 19 个字符来拆分 QString

这是字符串:

+1.838212011719E+04-1.779050827026E+00 3.725290298462E-09 0.000000000000E+00

我想把它分成:

+1.838212011719E+04
-1.779050827026E+00
3.725290298462E-09
0.000000000000E+00

我尝试过使用QRegularExpression,但我无法提出解决方案。

如何做到这一点?

【问题讨论】:

  • 到目前为止你有什么尝试?

标签: c++ qt qstring


【解决方案1】:

使用这个正则表达式:

^(.{19})(.{19})(.{19})(.{19})

我还建议使用RegEx101 之类的工具。试一试,看看会发生什么。

【讨论】:

  • 为什么不将“$”添加到正则表达式的末尾?也许这样的事情可能是正确的: /^\s*(.{19})(.{19})(.{19})(.{19})\s*$/
  • 谢谢,help-info.de。它对我有用。由于存在空格和必要的包装,我不得不对其进行一些调整。我非常感谢你的努力。您能告诉我我们是否可以根据任何此类条件拆分 QBytearray 吗? QBytearray 的 split 函数仅适用于分隔符。但我的是一个非分隔文件。否则我宁愿读入 QBytearray。
【解决方案2】:

解决方案

我建议您使用循环而不是正则表达式。

示例

这是我为您准备的一个示例,说明如何在 C++ 中实现这一点:

bool splitString(const QString &str, int n, QStringList &list)
{
    if (n < 1)
        return false;

    QString tmp(str);

    list.clear();

    while (!tmp.isEmpty()) {
        list.append(tmp.left(n));
        tmp.remove(0, n);
    }

    return true;
}

注意:您可以选择使用QString::trimmed(),即list.append(tmp.left(n).trimmed());,以消除前导空格。

结果

使用您的输入测试示例:

QStringList list;

if (splitString("+1.838212011719E+04-1.779050827026E+00 3.725290298462E-09 0.000000000000E+00", 19, list))
    qDebug() << list;

产生以下结果:

  • 没有QString::trimmed()

      ("+1.838212011719E+04", "-1.779050827026E+00", " 3.725290298462E-09", " 0.000000000000E+00")
    
  • QString::trimmed()

      ("+1.838212011719E+04", "-1.779050827026E+00", "3.725290298462E-09", "0.000000000000E+00")
    

【讨论】:

  • 感谢您提供如此清晰的解释。虽然正则表达式解决了我的问题。但是,我必须说,这让我对如何处理可以通过显式编码更加手动控制的问题有了更深入的了解。尽管如此,有什么理由建议不要使用正则表达式? (即使在文档中,它也建议正则表达式是处理字符串/文本的强大方法)因此我选择了它
  • @KOUSHIKNAG,阅读this正如预期的那样,基于 QRegularExpression 的速度慢了两个数量级
  • @KOUSHIKNAG,此外,如果您喜欢这个答案,请考虑在您的声望达到 15 或更多时点赞。
  • @KOUSHIKNAG,给你一个支持我建议的方法的理由:它适用于任何长度的输入字符串。用更短或更长的字符串尝试建议的正则表达式,看看会发生什么。
  • 当然,知识值得 2 个赞!我得到了你的分数!真棒!正则表达式有其缺陷。感谢您的努力! :)
猜你喜欢
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多