今天介绍几种在C++中常见的字符串截取

①substr,可以直接按照下标进行截取指定宽度。

适用于解析日期类,缺点无法适用于中文,因为在string类型中,中文占用2个字符,即使按照2个字符截取,但截取时也仍然存在截取后返回中文乱码的问题。

使用方法:字符串首个下标为1,str1.substr(2,3)表示从2第二个开始,向后截取3个字符

//示例1
std::string str1 = "abcabc";
std::string str2 = str1.substr(2,3);

str2 = "cab"
//示例2
std::string time = "2022-09-30 12:30:56";
std::string year = time.substr(0,4);    //从0个后面的元素开始,2022
std::string month = time.substr(5,2);    //从第5个“_”的后面元素开始,09
std::string day = time.substr(8,2);     //30
std::string hour = time.substr(11,2);   //空格也算一个字符
std::string min = time.substr(14,2);    //英文冒号也算作一个字符

②split,按照指定规则进行拆分

由于C++中无法直接使用字符串分割,所以需要引入一些现有的库或者环境,无论是boost,还是qstring都可以直接调用split函数,

2.1boost方法,首先需要配置boost的库,接着配置#include <boost/algorithm/string.hpp>头文件,配置using namespace boost命名空间,然后使用split函数,对字符串按照boost::is_any_of("_")进行分隔,分割完成后,被分割的元素按照顺序存在vector中。

//首先需要在VS工程中配置boost的环境,若没有配置,需要按照项目需要进行考量

//引用关键的头文件
#include <boost/algorithm/string.hpp>
//包含命名空间
using namespace boost;

int main()
{
    vector <string> vec;	

    std::string time="2022-09-30";

    boost::split(vec, time, boost::is_any_of("_"));
    //按照“_”对字符串进行分割,得到vec{2022,09,30}三个元素
}

2.2QString方法,首先需要配置qt的环境,接着配置#include <QString.h>头文件,直接使用split函数对QString字符串进行拆分,将拆分结果保存在QStringList中,同时也可以参见Qt的Assistant,

//同样的,需要预先配置qt的环境,这个也是按照项目需求来进行,

//只需引入QString文件

#include<QString.h>

QString str = "a,,b,c";

QStringList list1 = str.split(',');
//表示按照“,”进行截取,截取的内容按顺序存放到QStringList中
// list1: [ "a", "", "b", "c" ]

QStringList list2 = str.split(',', QString::SkipEmptyParts);
//QString::SkipEmptyParts参数表示,截取后的内容为空的则直接舍弃
// list2: [ "a", "b", "c" ]

而其他语言例如python也可以直接使用split函数。

③正则表达式,自己指定详细的规则进行拆分

好处就是无须配置庞大的环境,

如理解这里,需要预先的了解正则表达式的简单使用方法,故正则表达式在此不展开,只贴上代码,可自行理解。

//预先配置头文件
#include <regex>
	
std::vector<std::string> vec;
std::string strValues = (LPCTSTR)str;
//制定规则,按照英文“;”进行拆分
std::regex re(",|;|\\s+");
std::sregex_token_iterator p(strValues.begin(), strValues.end(), re, -1);
std::sregex_token_iterator end;

while (p != end)
{
	std::string pStr = *p++;
	if (pStr.empty())
	{
		continue;
	}
	vec.push_back(pStr.c_str());
}
//对结果进行一次去重处理
std::unique(vec.begin(), vec.end());

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐