QString 截取分割字符串

本文详细介绍了QString类中的section()和split()函数用法,通过实例展示了如何利用这些函数从字符串中提取特定子串,并讨论了不同参数配置的影响。

Title :

  • QString
  • QString::section()
  • QString::split()

Q :

如何从一段由特殊符号分隔的 QString 中获取被分隔的子串?

  • 从字符串“one, two, three, four”中获取第二个由‘,’分隔的子串,即“two” ;
QString str = "one, two, three, four";
cout << str.section(',', 1, 1).trimmed().toStdString() << endl;

结果是 “two”,前后不包含空格。上面的函数 trimmed() 是去掉字符串前后的ASCII字符 ‘\t’, ‘\n’, ‘\v’, ‘\f’, ‘\r’, and ’ ‘,这些字符用QChar::isSpace()判断都返回true。重点是 section()函数,见下面详细。

  • 从字符串 “one, two* three / four / five ^ six”中获取第四个由 ‘,’、‘*’、 ‘/’和’^’分隔的子串,即“four”;
QString str = "one, two* three / four / five ^ six";
cout << str.section(QRegExp("[,*/^]"), 3, 3).trimmed().toStdString() << endl;

上面用到了一个简单的正则表达式,在Qt中可以由类QRegExp构造,函数 section() 支持使用正则表达式。


重点内容

Fn 1 :

QString QString::section ( QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault ) const

这个函数把字符串看成是几个块,这些块由 sep 分隔,start 和 end 指定块号,end 默认为 –1 ,返回的是[ start, end ]内的块组成的字符串,如果 start 和 end 都是负数,那么将从字符串的后面往前面数,返回 [ -end, –start ]内的块组成的字符串。SectionFlags是一些标记,如SectionSkipEmpty表示如果两个分隔符之间是空串,那么就会跳过。下面的代码是摘自QtDoc 4.7:

QString str;
QString csv = "forename,middlename,surname,phone";
QString path = "/usr/local/bin/myapp"; // First field is empty
QString::SectionFlag flag = QString::SectionSkipEmpty;

str = csv.section(',', 2, 2);   // str == "surname"
str = path.section('/', 3, 4);  // str == "bin/myapp"
str = path.section('/', 3, 3, flag); // str == "myapp"

str = csv.section(',', -3, -2);  // str == "middlename,surname"
str = path.section('/', -1); // str == "myapp"

另外这个函数的另两个重载函数如下:

QString QString::section ( const QString & sep, int start, int end = -1, SectionFlags flags = SectionDefault ) const
QString QString::section ( const QRegExp & reg, int start, int end = -1, SectionFlags flags = SectionDefault ) const

第二个支持正则表达式作为分隔符判定,在某些场合下是不可替代的,如上面的问题中的第二个。

Fn 2 :

QStringList QString::split ( const QChar & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const

这个函数把所有的由 sep 分隔的块装进一个 QStringList 中返回, 这个函数同样有两个重载:

QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
QStringList QString::split ( const QRegExp & rx, SplitBehavior behavior = KeepEmptyParts ) const

使用 split() 函数对上述两个问题中的第二个进行求解:

QString str = "one, two* three / four / five ^ six";
QStringList sections = str.split(QRegExp("[,*/^]")); //把每一个块装进一个QStringList中
cout << sections.at(3).trimmed().toStdString() << endl;

End:

Author : Ggicci

多谢阅读,有误希望指正!

http://tmjfzy.blog.163.com/blog/static/664470252012645536321/

### 如何使用 Qt QString 截取字符串 在 Qt 中,`QString` 提供了多种方法用于截取字符串。以下是一些常用的方法及其示例代码。 #### 1. 使用 `left()` 方法 `left(int n)` 方法用于从字符串的开头截取指定长度的字符。如果字符串是以字节为单位存储(例如 UTF-8 编码),则需要注意一个字符可能由多个字节组成[^2]。 ```cpp QString str = "Hello World"; QString result = str.left(5); // 截取前 5 个字符 // result: "Hello" ``` #### 2. 使用 `right()` 方法 `right(int n)` 方法用于从字符串的末尾截取指定长度的字符。 ```cpp QString str = "Hello World"; QString result = str.right(5); // 截取最后 5 个字符 // result: "World" ``` #### 3. 使用 `mid()` 方法 `mid(int position, int n)` 方法用于从指定位置开始截取指定长度的字符。如果省略第二个参数,则从指定位置开始截取字符串末尾。 ```cpp QString str = "Hello World"; QString result1 = str.mid(6, 5); // 从索引 6 开始截取 5 个字符 // result1: "World" QString result2 = str.mid(6); // 从索引 6 开始截取到末尾 // result2: "World" ``` #### 4. 使用 `split()` 方法 `split(const QString &sep)` 方法用于根据指定的分隔符将字符串分割成多个部分,并返回一个字符串列表。 ```cpp QString str = "E:/Data/20210218/Section/test_00501_CH1.jpg"; QStringList parts = str.split("/"); // 按 "/" 分割字符串 // parts: ["E:", "Data", "20210218", "Section", "test_00501_CH1.jpg"] QString firstPart = parts.at(0); // 获取第一个部分 // firstPart: "E:" ``` #### 5. 使用 `section()` 方法 `section(const QString &sep, int start, int end)` 方法用于根据分隔符截取字符串一部分。可以通过正数或负数指定起始和结束位置。 ```cpp QString sPath = "E:/Data/20210218/Section/test_00501_CH1.jpg"; // A. 正号截取 QString sDate = sPath.section('/', 0, 2); // 获取文件前三级路径 // sDate: "E:/Data/20210218" // B. 负号截取 QString sCh = sPath.section('_', -2); // 获取倒数第二个 "_" 后的部分 // sCh: "00501_CH1.jpg" QString sChExact = sPath.section('_', -2, -2); // 获取倒数第二个 "_" 的部分 // sChExact: "00501" // C. 正号+负号截取 QString sUpperDir = sPath.section('/', 0, -2); // 获取文件所在的上级路径 // sUpperDir: "E:/Data/20210218/Section" ``` #### 6. 处理时间字符串的示例 以下是一个处理时间字符串并进行分割的完整示例[^3]: ```cpp #include <QString> #include <QDebug> int main() { QString time = "085150.00"; // 给定的时间字符串 // 去除时间字符串中的小数部分(.00),只处理整数部分 QString timeWithoutDecimal = time.split(".")[0]; // 分割字符串,提取小时、分钟和秒数 QString H_str = timeWithoutDecimal.mid(0, 2); // 提取前两位作为小时 QString M_str = timeWithoutDecimal.mid(2, 2); // 提取中间两位作为分钟 QString S_str = timeWithoutDecimal.mid(4, 2); // 提取最后两位作为秒数 // 转换为整数进行加法运算 int H = H_str.toInt() + 8; // 将小时部分加上 8 int M = M_str.toInt(); // 分钟部分 int S = S_str.toInt(); // 秒数部分 // 将结果转回 QString 类型 QString H_str_final = QString::number(H); // 赋值给 H QString M_str_final = QString::number(M); // 赋值给 M QString S_str_final = QString::number(S); // 赋值给 S // 打印结果 qDebug() << "H:" << H_str_final; qDebug() << "M:" << M_str_final; qDebug() << "S:" << S_str_final; return 0; } ``` ### 注意事项 - 如果需要按字节截取字符串,请先将 `QString` 转换为 `QByteArray`,然后进行操作[^2]。 - 在处理多字节字符时,建议使用 `QChar` 或其他高级方法以确保正确性[^1]。
要在QString截取字符串,有几种方法可以实现。一种方法是使用QString类的mid函数。该函数的原型是QString QString::mid(int position, int n = -1) const。其中position是指定截取字符串的起始位置,n是指定截取字符串的长度。如果n为-1或超过可用字符串的长度,则返回自position开始的全部字符串。另一种方法是使用QString的split函数分割字符串。先将QString转换为字符串类型,然后使用split函数将其分割成一个QStringList。例如,如果要按照"/"分割日期字符串,则可以使用以下代码: QString date = dateEdit.toString("yyyy/MM/dd"); QStringList list = date.split("/"); 这样就可以得到一个包含分割后的子字符串QStringList对象。此外,如果你想使用std::string来截取字符串,你可以使用std::basic_string的substr函数。substr函数的原型是:std::basic_string::substr(size_type __pos, size_type __n) const或basic_string substr(size_type pos = 0, size_type count = npos)。其中__pos是指定截取字符串的起始位置,__n是指定截取字符串的长度。以上是qstring截取字符串的几种方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Qt QString字符串分割截取](https://blog.csdn.net/qq_17313923/article/details/115655088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
QString中,有几种方法可以截取字符串。 一种方法是使用QString的mid函数,该函数的作用是返回从指定位置开始的子字符串。mid函数的参数包括position和n,其中position表示要开始截取的位置,n表示要截取的字符数。如果不指定n的值,默认为-1,表示截取字符串的末尾。例如,使用QString的mid函数可以截取指定位置开始的子字符串。 另一种方法是使用QString的split函数进行字符串分割。首先,将QString转换为标准字符串std::string,然后使用std::string的处理函数进行字符串分割。例如,可以使用QString的split函数将日期字符串按照指定的分隔符进行分割。将分割后的子字符串存储在QStringList中。 总结起来,QString类提供了多种方法来截取字符串,包括使用mid函数和split函数。这些方法可以根据具体需求选择使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [QT中QString 类的使用--获取指定字符位置、截取字符串等](https://blog.csdn.net/qq_22642239/article/details/120704182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Qt QString字符串分割截取](https://blog.csdn.net/qq_17313923/article/details/115655088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
可以使用QString的split函数来截取字符串。首先,你需要将QDateEdit对象转换为QString类型的日期字符串,可以使用toString函数将其格式化为"yyyy/MM/dd"格式的字符串。然后,使用split函数将日期字符串按照指定的分隔符"/"进行分割,得到一个QStringList对象。每个元素都是被分割后的子字符串。 另外,如果你想要截取字符串一部分,可以使用substr函数或者mid函数。substr函数的参数是起始位置和长度,返回从起始位置开始指定长度的子字符串。 如果你想要判断一个字符串是否包含另一个字符串,可以使用indexOf函数。这个函数返回指定字符串在原字符串中第一次出现的位置索引。如果找不到,则返回-1。 综上所述,你可以根据需要使用split函数、substr函数或者indexOf函数来截取QString字符串123 #### 引用[.reference_title] - *1* *2* [Qt QString字符串分割截取](https://blog.csdn.net/qq_17313923/article/details/115655088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [QT中QString 类的使用--获取指定字符位置、截取字符串等](https://blog.csdn.net/qq_22642239/article/details/120704182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值