我了解QString::split
应该用于从多行QStringList
获取QString
。但是如果我有一个文件并且我不知道它是来自Mac,Windows还是Unix,我不确定QString.split("\n")
是否适用于所有情况。处理这种情况的最佳方法是什么?
答案 0 :(得分:34)
如果删除空白行是可以接受的,您可以尝试:
QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
只要找到任何换行符(换行符或回车符),就会拆分字符串。任何连续的换行符(例如\r\n\r\n
或\n\n
)都将被视为多个分隔符,它们之间包含空白部分,将被跳过。
答案 1 :(得分:24)
Emanuele Bezzi's answer错过了几点。
在大多数情况下,将使用文本流读取从文本文件读取的字符串,该文本流会自动将操作系统的行尾表示转换为单个'\n'
字符。因此,如果您要处理本机文本文件,'\n'
应该是您需要担心的唯一分隔符。例如,如果您的程序在Windows系统上运行,以文本模式读取输入,则行结尾将标记为 in memory ,其中包含单个\n
个字符;你永远不会看到文件中存在的"\r\n"
对。
但有时您需要处理“外国”文本文件。
理想情况下,您应该在阅读之前将任何此类文件翻译为本地格式,这样可以避免此问题。只有翻译实用程序需要知道变体行结尾;其他一切只是处理文本。
但这并不总是可行的;有时您可能希望程序在POSIX系统(Linux,UNIX等)上运行时处理Windows文本文件,反之亦然。
POSIX系统上的Windows格式文本文件在每行末尾会显示额外的'\r'
个字符。
Windows系统上的POSIX格式文本文件似乎包含一个非常长的行,其中嵌入了'\n'
个字符。
最常用的方法是以二进制模式读取文件并明确处理行结尾。
我不熟悉QString.split
,但我怀疑这个:
QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
将忽略空行,这些行将显示为"\n\n"
或"\r\n\r\n"
,具体取决于格式。空行是完全有效的文本数据;你不应该忽视它们,除非你确定这样做是有道理的。
如果您需要处理由"\n"
,"\r\n"
或"\r"
分隔的文字输入,那么我认为是这样的:
QString.split(QRegExp("\n|\r\n|\r"));
会做这个工作。 (感谢parsley72的评论帮助我使用正则表达式语法。)
另一点:您可能不会遇到仅使用'\r'
分隔行的文本文件。这是MacOS使用的格式,直到版本9.MaxOS X基于UNIX,它使用标准的UNIX样式'\n'
行结尾(尽管它也可能容忍'\r'
行结尾。/ p>