【问题标题】:How to split a string based on empty/blank lines?如何根据空/空行拆分字符串?
【发布时间】:2021-12-18 16:14:53
【问题描述】:

我正在编写一个应该解析 .srt 字幕文件的 c++ 应用程序(Qt Widgets)。文件的每一部分由一个空行分隔,如下所示:

1
00:00:08,000 --> 00:00:11,000
[Line]

2
00:00:56,034 --> 00:00:57,492
[Line]
[Another line]

3
00:01:13,676 --> 00:01:15,420
[Line]

基本上,我想将整个文件读入QString,然后用空行将其拆分为QString 数组,每个项目都包含这样的部分之一:

2
00:00:56,034 --> 00:00:57,492
[Line]
[Another line]

但是,我不知道该怎么做。我尝试将字符串按\r\n 拆分,但这会将所有内容拆分为单独的行,而不是空行。

这是我从 .srt 文件中获取数据的例程:

  • 将文件的所有内容读入QString(名称类似于content)。
  • QString 拆分为空行,并附加到QStringList(名称类似于sections)。
  • 对于sections 中的每一项,用--> 标识符分割第二行,并将索引01 分配给名为QString 的变量@987654335 @ 和 endTime
  • 取出其余的行(第 2 行之后的所有内容都是字幕文本),并将它们附加到名为 subtitleTextQString
  • 将所有收集到的信息添加到SrtSubtitle 实例,并将其附加到QList<SrtSubtitle>

我怎样才能做到这一点?

【问题讨论】:

  • 类初始化器看起来像这样:new -- 你有什么理由使用new 来创建你的对象? C++ 不是 Java 或 C#。如果QList 像任何标准类一样工作,并且它是StrSubtitleItem 的QList,那么qList.add(StrSubtitleItem(start, end, subtitleText)); 或任何add 函数将被调用应该工作。
  • 我不知道这一点。无论如何,我更多地使用 C# 和 Java 编程(Android 和 Windows 开发)。感谢您的提示!

标签: c++ qt qt5 qstring


【解决方案1】:

我会改进 ziarra 的回答。您当然希望该解决方案功能强大,并且还可以使用 Windows 行尾 "\r\n" 而不是 "\n"。在那种情况下,ziarra 的解决方案是不够的。

所以我的建议是分两步做:

  1. 将所有出现的"\r\n" 替换为"\n"
  2. "\n\n" 分割文本(正如ziarra 建议的那样)

【讨论】:

    【解决方案2】:

    新行通常表示为\n

    要在有 2 个新行之间没有任何内容的情况下拆分字符串,可以使用 \n\n 作为分隔符。

    【讨论】:

    • 成功了,谢谢!
    • 这不够健壮。在 Windows 上,新行可以用“\r\n”分隔。并且空行也可以包含空白字符(例如,当用户翻译文本并错误地将一些空格或制表符放入空行时)。这个提议的解决方案非常脆弱,我永远不会推荐它用于生产质量软件。
    • 是的,您可以更深入地使其更健壮。但在这种情况下,他的输出看起来是生成的。因此,为什么当中间没有空格时该解决方案有效。你也不想在不必要的地方让它变得太复杂。
    • 是的,但处理 windows 行尾“\r\n”即使它是自动生成的也是有意义的。
    • @V.K.这也可能取决于文件的读取方式。在 Windows 中,有所谓的文本模式(在没有std::ios::binary 标志的流中默认),它在阅读时将每个\r\n 替换为\n。然而,如果在 Linux 中读取 Windows 文本文件,这可能会反击。此外,我在处理 coliru(在线编译器)中的文本时痛苦地意识到了这个问题,这实际上是在网站中输入的源代码本身......
    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多