揽月老爸 發表於 2026-1-13 09:59:44

QT中QString按照空格和Tab拆分

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、核心知识点</li><li>二、按空格拆分(&quot; &quot;)</li><ul class="second_class_ul"><li>1. 基础用法(跳过连续空格)</li><li>2. 保留空项(默认行为)</li></ul><li>三、按 Tab 键拆分(&quot;\t&quot;)</li><ul class="second_class_ul"><li>1. 基础用法(跳过连续 Tab)</li><li>2. 保留空项(默认行为)</li></ul><li>四、进阶:同时按空格和 Tab 拆分</li><ul class="second_class_ul"></ul><li>总结</li><ul class="second_class_ul"></ul><li>五、解读</li><ul class="second_class_ul"></ul><li>1. 先明确两个关键规则(对应你的疑问)</li><ul class="second_class_ul"></ul><li>2. 实际示例(覆盖你关心的场景)</li><ul class="second_class_ul"></ul><li>3. 补充:如果只想匹配&ldquo;空格+Tab&rdquo;(排除换行/回车等)</li><ul class="second_class_ul"></ul><li>总结</li><ul class="second_class_ul"></ul></ul></div><p>在 Qt 中,QString::split() 方法支持按指定分隔符拆分字符串,按空格和Tab 键拆分的核心是指定正确的分隔符,并根据需求处理连续分隔符的情况。以下是详细用法和示例:</p>
<p class="maodian"></p><h2>一、核心知识点</h2>
<ul><li>QString::split(const QString &amp;sep, SplitBehavior behavior = KeepEmptyParts):<ul><li>sep:分隔符(空格用 &quot; &quot;,Tab 用 &quot;\t&quot;)</li><li>behavior:拆分行为(关键!处理连续分隔符)<ul><li>KeepEmptyParts(默认):保留空字符串(如连续空格会拆出空项)</li><li>SkipEmptyParts:跳过空字符串(实际开发中更常用,避免无用空项)</li></ul></li></ul></li></ul>
<p class="maodian"></p><h2>二、按空格拆分(&quot; &quot;)</h2>
<p class="maodian"></p><h3>1. 基础用法(跳过连续空格)</h3>
<p>最常用场景:拆分以<strong>一个或多个空格</strong>分隔的字符串(如命令行参数、空格分隔的文本)。</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;QString&gt;
#include &lt;QStringList&gt;
#include &lt;QDebug&gt;

int main() {
    QString str = "HelloWorld   Qt编程助手"; // 包含1个、2个、3个连续空格
    // 按空格拆分,跳过空项(SplitBehavior::SkipEmptyParts)
    QStringList result = str.split(" ", Qt::SkipEmptyParts);
   
    // 输出结果:["Hello", "World", "Qt", "编程助手"]
    qDebug() &lt;&lt; "按空格拆分结果:" &lt;&lt; result;
    return 0;
}
</pre></div>
<p class="maodian"></p><p class="maodian"></p><h3>2. 保留空项(默认行为)</h3>
<p>如果需要保留连续空格产生的空字符串(极少用):</p>
<div class="jb51code"><pre class="brush:cpp;">QString str = "ab c";
QStringList result = str.split(" "); // 不指定behavior,默认KeepEmptyParts
// 输出结果:["a", "", "b", "c"](两个空格之间拆出空项)
qDebug() &lt;&lt; result;
</pre></div>
<p class="maodian"></p><h2>三、按 Tab 键拆分(&quot;\t&quot;)</h2>
<p>Tab 键的转义字符是 <code>&quot;\t&quot;</code>,用法与空格完全一致,仅需替换分隔符。</p>
<p class="maodian"></p><h3>1. 基础用法(跳过连续 Tab)</h3>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;QString&gt;
#include &lt;QStringList&gt;
#include &lt;QDebug&gt;

int main() {
    QString str = "姓名\t年龄\t\t性别\t职业"; // 包含1个、2个连续Tab
    // 按Tab拆分,跳过空项
    QStringList result = str.split("\t", Qt::SkipEmptyParts);
   
    // 输出结果:["姓名", "年龄", "性别", "职业"]
    qDebug() &lt;&lt; "按Tab拆分结果:" &lt;&lt; result;
    return 0;
}
</pre></div>
<h3>2. 保留空项(默认行为)</h3>
<div class="jb51code"><pre class="brush:cpp;">QString str = "x\ty\t\tz";
QStringList result = str.split("\t"); // 保留空项
// 输出结果:["x", "y", "", "z"](两个Tab之间拆出空项)
qDebug() &lt;&lt; result;
</pre></div>
<p class="maodian"></p><h2>四、进阶:同时按空格和 Tab 拆分</h2>
<p>如果需要同时拆分<strong>空格和 Tab</strong>(比如处理混合分隔符的文本),可以用 <code>QRegExp</code> 作为分隔符:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;QRegExp&gt;

QString str = "Hello\tWorldQt\t\t编程助手";
// 匹配一个或多个空格或Tab(\\s 表示空白字符,包含空格、Tab、换行等)
QStringList result = str.split(QRegExp("\\s+"), Qt::SkipEmptyParts);
// 输出结果:["Hello", "World", "Qt", "编程助手"]
qDebug() &lt;&lt; result;
</pre></div>
<p class="maodian"></p><p class="maodian"></p><h2>总结</h2>
<table><thead><tr><th>拆分需求</th><th>代码示例</th><th>关键说明</th></tr></thead><tbody><tr><td>按空格拆分(去空项)</td><td>str.split(&quot; &quot;, Qt::SkipEmptyParts)</td><td>处理连续空格</td></tr><tr><td>按 Tab 拆分(去空项)</td><td>str.split(&quot;\t&quot;, Qt::SkipEmptyParts)</td><td>处理连续 Tab</td></tr><tr><td>同时按空格+Tab 拆分</td><td>str.split(QRegExp(&quot;\\s+&quot;), Qt::SkipEmptyParts)</td><td>匹配所有空白字符</td></tr></tbody></table>
<p>开发建议:优先使用 Qt::SkipEmptyParts,避免拆分后出现无用的空字符串,减少后续处理麻烦。</p>
<p class="maodian"></p><h2>五、解读</h2>
<div class="jb51code"><pre class="brush:cpp;">QStringList result = str.split(QRegExp("\\s+"), Qt::SkipEmptyParts);
</pre></div>
<p>这行代码<strong>既能匹配所有空白字符,也能完美处理字符间多个连续空格、多个连续Tab,以及空格与Tab混合的情况</strong>,核心原因的是正则表达式 <code>\\s+</code> 的设计:</p>
<p class="maodian"></p><h2>1. 先明确两个关键规则(对应你的疑问)</h2>
<table><thead><tr><th>正则部分</th><th>作用说明</th></tr></thead><tbody><tr><td>\\s</td><td>匹配 所有空白字符(Qt的QRegExp中,\s 等价于 [ \t\n\r\f]):<br />- 普通空格( )、Tab(\t)<br />- 换行(\n)、回车(\r)、换页符(\f)<br />(如果只想匹配&ldquo;空格+Tab&rdquo;,不想包含换行/回车,可改成 [ \\t]+)</td></tr><tr><td>+</td><td>匹配 一个或多个连续 的前面字符(即连续的空白字符会被当成&ldquo;一个整体分隔符&rdquo;)</td></tr><tr><td>Qt::SkipEmptyParts</td><td>强制跳过拆分后可能产生的空字符串(结合 \\s+ 几乎不会出现空项,但加上更稳妥)</td></tr></tbody></table>
<p class="maodian"></p><h2>2. 实际示例(覆盖你关心的场景)</h2>
<p>假设字符串包含 <strong>多个空格、多个Tab、空格+Tab混合</strong>,拆分效果如下:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;QString&gt;
#include &lt;QStringList&gt;
#include &lt;QRegExp&gt;
#include &lt;QDebug&gt;

int main() {
    // 测试字符串:包含 2个空格、3个Tab、空格+Tab混合(中间无其他字符)
    QString str = "HelloWorld\t\t\tQt\t编程助手\nTest\rFoo\fBar";
   
    // 按正则拆分
    QStringList result = str.split(QRegExp("\\s+"), Qt::SkipEmptyParts);
   
    // 输出结果:["Hello", "World", "Qt", "编程助手", "Test", "Foo", "Bar"]
    qDebug() &lt;&lt; "拆分结果:" &lt;&lt; result;
    return 0;
}
</pre></div>
<p>可以看到:</p>
<ul><li>连续2个空格(<code>Hello World</code>)&rarr; 当成1个分隔符,拆出 <code>Hello</code> 和 <code>World</code>;</li><li>连续3个Tab(<code>World\t\t\tQt</code>)&rarr; 当成1个分隔符,拆出 <code>World</code> 和 <code>Qt</code>;</li><li>空格+Tab混合(<code>Qt \t编程助手</code>)&rarr; 当成1个分隔符,拆出 <code>Qt</code> 和 <code>编程助手</code>;</li><li>换行(<code>\n</code>)、回车(<code>\r</code>)、换页符(<code>\f</code>)也被当成分隔符(如果不需要这些,后面会说怎么调整)。</li></ul>
<p class="maodian"></p><h2>3. 补充:如果只想匹配&ldquo;空格+Tab&rdquo;(排除换行/回车等)</h2>
<p>如果你的场景中,换行(<code>\n</code>)、回车(<code>\r</code>)是有效内容,不想被当成分隔符,只需把正则改成 <code>[ \\t]+</code>(明确只匹配&ldquo;空格&rdquo;和&ldquo;Tab&rdquo;):</p>
<div class="jb51code"><pre class="brush:cpp;">// 只匹配空格和Tab,不匹配换行/回车
QStringList result = str.split(QRegExp("[ \\t]+"), Qt::SkipEmptyParts);
</pre></div>
<p>比如上面的测试字符串,拆分后会保留换行后的内容(因为 <code>\n</code> 不再是分隔符):</p>
<div class="jb51code"><pre class="brush:cpp;">// 输出结果:["Hello", "World", "Qt", "编程助手\nTest\rFoo\fBar"]
</pre></div>
<h2>总结</h2>
<ul><li>你的核心疑问:是!str.split(QRegExp(&quot;\\s+&quot;), Qt::SkipEmptyParts) 完全满足需求&mdash;&mdash;匹配所有空白字符,且多个连续空格、多个Tab、空格+Tab混合,都会被当成&ldquo;一个分隔符&rdquo;处理,拆分后不会有多余空项。</li><li>实用建议:<ol><li>处理&ldquo;任意空白字符分隔&rdquo;(包括换行/回车)&rarr; 用 \\s+;</li><li>只处理&ldquo;空格+Tab分隔&rdquo;(排除换行等)&rarr; 用 [ \\t]+;</li><li>该写法是处理&ldquo;混合空白字符分隔&rdquo;的最优方案,比单独按空格或Tab拆分更通用。</li></ol></li></ul>
<p>到此这篇关于QT中QString按照空格和Tab拆分的文章就介绍到这了,更多相关QT QString空格和Tab拆分内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>基于PyQt5完成的PDF拆分功能</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: QT中QString按照空格和Tab拆分