c++在字符串中截取指定内容

今天介绍几种在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());

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值