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