资讯动态

使用QRegularExpression实现依次按名称中数字、字母、汉字进行排序

发布时间:2026/9/26 11:12:59 来源:尧图企业网站定制
最近工作中遇到一些类似型号的命名中文英文数字混合需要将中文、英文、数字分开进行排序。记得有很多网页或者软件实现了类似的功能但是在网上找了一下发现没有特别合适的代码感觉跟零件或者类似数据打交道的场景会很多因此记录一下数据示例不锈钢六角螺栓M8×1.25-50精密轴承608ZZ 弹簧垫圈DIN127B-10铜接线端子OT4-6碳钢自攻螺丝ST4.2×25铝合金角码L-5050-2mm镀锌膨胀螺栓M10×100尼龙螺母M6-0.75深沟球轴承6204-2RS黄铜接头G1/2-14内六角螺钉M5×0.8-20橡胶O型圈20×2.5不锈钢合页H-100-75碳钢挡圈DIN471-30铜编织带TZX-16mm2塑料膨胀管Φ8×40滚珠丝杆SFU1605-L300平键8×7×50GB1096镀锌链条6×18mm铝型材角件4040-8槽排序结果不锈钢合页H-100-75不锈钢六角螺栓M8×1.25-50弹簧垫圈DIN127B-10 镀锌链条6×18mm镀锌膨胀螺栓M10×100滚珠丝杆SFU1605-L300黄铜接头G1/2-14精密轴承608ZZ铝合金角码L-5050-2mm铝型材角件4040-8槽内六角螺钉M5×0.8-20尼龙螺母M6-0.75 平键8×7×50GB1096深沟球轴承6204-2RS塑料膨胀管Φ8×40碳钢挡圈DIN471-30碳钢自攻螺丝ST4.2×25铜编织带TZX-16mm2铜接线端子OT4-6橡胶O型圈20×2.5核心函数splitStringByDifferentChar函数功能通过 QRegularExpression 正则表达式将字符串按照汉字、英文、数字进行拆分、如不锈钢六角螺栓M8×1.25-50经过函数拆分后变为[“不锈钢六角螺栓”, “M”, “8”,“×” ,“1”,“.”,“25”,“-”,50 ]voidsortByDiffChars::splitStringByDifferentChar(constQStringstrInput,QListQStringlsSplitStr){staticconstQRegularExpressionre(([\\x{4e00}-\\x{9fff}]|\\d|[^\\x{4e00}-\\x{9fff}\\d]));QRegularExpressionMatchIterator ire.globalMatch(strInput);QString matched;while(i.hasNext()){matched;QRegularExpressionMatch matchi.next();if(match.hasMatch()){matchedmatch.captured(0);if(!matched.isEmpty()){// 忽略空匹配lsSplitStr.append(matched);}}}}排序函数compNumberString函数功能对纯数字字符串进行逐位排序如01、0、00、1、001、11函数执行后0、00、001、01、1、11boolsortByDiffChars::compNumberString(constQStringstr1,constQStringstr2){intnlsSize1str1.size();intnlsSize2str2.size();intnCountnlsSize1nlsSize2?nlsSize1:nlsSize2;for(intnIndex0;nIndexnCount;nIndex){if(nIndexnlsSize1nIndexnlsSize2){if(str1.at(nIndex)!str2.at(nIndex)){boolbIsNum1false;boolbIsNum2false;QString strNum1str1.at(nIndex);QString strNum2str2.at(nIndex);intnNum1strNum1.toInt(bIsNum1);intnNum2strNum2.toInt(bIsNum2);returnnNum1nNum2;}}elseif(nIndexnlsSize1nIndexnlsSize2){returntrue;}elseif(nIndexnlsSize1nIndexnlsSize2){returnfalse;}}returnfalse;}compStringByHZ函数功能根据汉字拼音进行排序如马到成功、春暖花开、一帆风顺、锦上添花、如鱼得水函数执行后春暖花开、锦上添花、马到成功、如鱼得水、一帆风顺boolsortByDiffChars::compStringByHZ(constQStringstr1,constQStringstr2){if(str1.isEmpty()||str2.isEmpty()){returnfalse;}boolbIsNum1false;boolbIsNum2false;intnNum1str1.toInt(bIsNum1);intnNum2str2.toInt(bIsNum2);if(bIsNum1bIsNum2){// 如果两个字符串都是数值型按逐位比较排序if(nNum1nNum2){returncompNumberString(str1,str2);}returnnNum1nNum2;}elseif(bIsNum1!bIsNum2){// 数值型排在前面returntrue;}elseif(!bIsNum1bIsNum2){// 数值型排在前面returnfalse;}else{// 字符串按汉字排序QLocalelocal(QLocale::Chinese);QCollatorcollator(local);return(collator.compare(str1,str2)0);}returnfalse;}sortStringListByDifferentChar函数功能对传入的两个字符串进行根据汉字、英文、数字、符号等分段进行排序如不锈钢合页Y-100-75 、不锈钢合页H-100-75 、不锈钢合页H-101-75排序后变为不锈钢合页H-100-75、不锈钢合页H-101-75、不锈钢合页Y-100-75boolsortByDiffChars::sortStringListByDifferentChar(constQStringstr1,constQStringstr2){// 分割字符串QStringList lsPort1,lsPort2;splitStringByDifferentChar(str1,lsPort1);splitStringByDifferentChar(str2,lsPort2);intnlsSize1lsPort1.size();intnlsSize2lsPort2.size();// 获取最长的长度intnCountnlsSize1nlsSize2?nlsSize1:nlsSize2;// 遍历两个字符串的每个字符for(intnIndex0;nIndexnCount;nIndex){// 若当前Index同时小于两个字符串长度时if(nIndexnlsSize1nIndexnlsSize2){if(lsPort1.at(nIndex)!lsPort2.at(nIndex)){// 比较两个被分割后的字符串同一位置returncompStringByHZ(lsPort1.at(nIndex),lsPort2.at(nIndex));}}// 若当前Index仅小于第二个字符串长度时elseif(nIndexnlsSize1nIndexnlsSize2){// 第一个字符串排在前面returntrue;}// 若当前Index仅小于第一个字串长度时elseif(nIndexnlsSize1nIndexnlsSize2){// 第二个字符串排在前面returnfalse;}}returnfalse;}排序函数的主要思路为先对传入的容器类数据进行逐位比较当所遍历的索引皆小于两个容器总数时比较当前索引下取出的字符串若不同则直接得出排序结果若相同则继续进行下一位比对若有一方遍历到最后则该容器对应的字符串排在前面界面排序前排序后代码sortByDiffChars.h#pragmaonce#includeQtWidgets/QMainWindow#includeui_sortByDiffChars.h// 界面控件头文件#includeqlistwidget.h#includeqpushbutton.h#includeqlayout.h/// summary/// 该程序使用正则表达式分离字符串进行排序从而实现对字母、数字、汉字、符号的分块排序/// /summaryclasssortByDiffChars:publicQMainWindow{Q_OBJECTpublic:sortByDiffChars(QWidget*parentnullptr);~sortByDiffChars();voidinitUI();QStringListgetStrList();// 根据字符分离字符串voidsplitStringByDifferentChar(constQStringstrInput,QListQStringlsSplitStr);// 根据字符依次进行排序boolsortStringListByDifferentChar(constQStringstr1,constQStringstr2);// 根据汉字进行排序boolcompStringByHZ(constQStringstr1,constQStringstr2);// 比较数字字符串 如01、001boolcompNumberString(constQStringstr1,constQStringstr2);private:Ui::sortByDiffCharsClass ui;QListWidget*m_pListWidget;QPushButton*m_pBtn;};sortByDiffChars.cpp#includesortByDiffChars.h#includeqregularexpression.h#includeqcollator.h// 编码转义#defineGB(text)(QString::fromLocal8Bit(text))sortByDiffChars::sortByDiffChars(QWidget*parent):QMainWindow(parent){//ui.setupUi(this);// 界面初始化initUI();}sortByDiffChars::~sortByDiffChars(){}voidsortByDiffChars::initUI(){// 设置窗口名称setWindowTitle(GB(排序测试));// 创建显示列表m_pListWidgetnewQListWidget(this);m_pListWidget-addItems(getStrList());// 创建排序按钮m_pBtnnewQPushButton(this);m_pBtn-setText(GB(排序));// 设置整体布局QVBoxLayout*pVlaynewQVBoxLayout(this);pVlay-addWidget(m_pListWidget);pVlay-addWidget(m_pBtn);// MainWindow直接setlayout不生效需要对中心窗口进行设置QWidget*widgetnewQWidget(this);this-setCentralWidget(widget);widget-setLayout(pVlay);// 设置窗口大小resize(618,1000);// connectconnect(m_pBtn,QPushButton::clicked,this,[](){// 获取列表中所有内容QStringList strList;for(intnIndex0;nIndexm_pListWidget-count();nIndex){QString strm_pListWidget-item(nIndex)-text();strList.append(str);}// 字符串列表排序std::sort(strList.begin(),strList.end(),[](QString str1,QString str2)-bool{// 按汉字排序(数字型字符串按数字排序)returnsortStringListByDifferentChar(str1,str2);});// 回填排序后的字符串列表m_pListWidget-clear();m_pListWidget-addItems(strList);});}QStringList sortByDiffChars::getStrList(){// 构建字符串QStringList list;// 纯数字字符串list.append(01);list.append(1);list.append(11);list.append(111);list.append(001);list.append(0);// 字符串list.append(GB(不锈钢六角螺栓M8×1.25-50));list.append(GB(精密轴承608ZZ));list.append(GB(弹簧垫圈DIN127B-10));list.append(GB(铜接线端子OT4-6));list.append(GB(碳钢自攻螺丝ST4.2×25));list.append(GB(铝合金角码L-5050-2mm));list.append(GB(镀锌膨胀螺栓M10×100));list.append(GB(尼龙螺母M6-0.75));list.append(GB(深沟球轴承6204-2RS));list.append(GB(黄铜接头G1/2-14));list.append(GB(内六角螺钉M5×0.8-20));list.append(GB(橡胶O型圈20×2.5));list.append(GB(不锈钢合页H-100-75));list.append(GB(碳钢挡圈DIN471-30));list.append(GB(铜编织带TZX-16mm2));list.append(GB(塑料膨胀管Φ8×40));list.append(GB(滚珠丝杆SFU1605-L300));list.append(GB(平键8×7×50GB1096));list.append(GB(镀锌链条6×18mm));list.append(GB(铝型材角件4040-8槽));//list.append();returnlist;}voidsortByDiffChars::splitStringByDifferentChar(constQStringstrInput,QListQStringlsSplitStr){staticconstQRegularExpressionre(([\\x{4e00}-\\x{9fff}]|\\d|[^\\x{4e00}-\\x{9fff}\\d]));QRegularExpressionMatchIterator ire.globalMatch(strInput);QString matched;while(i.hasNext()){matched;QRegularExpressionMatch matchi.next();if(match.hasMatch()){matchedmatch.captured(0);if(!matched.isEmpty()){// 忽略空匹配lsSplitStr.append(matched);}}}}boolsortByDiffChars::sortStringListByDifferentChar(constQStringstr1,constQStringstr2){// 分割字符串QStringList lsPort1,lsPort2;splitStringByDifferentChar(str1,lsPort1);splitStringByDifferentChar(str2,lsPort2);intnlsSize1lsPort1.size();intnlsSize2lsPort2.size();// 获取最长的长度intnCountnlsSize1nlsSize2?nlsSize1:nlsSize2;// 遍历两个字符串的每个字符for(intnIndex0;nIndexnCount;nIndex){// 若当前Index同时小于两个字符串长度时if(nIndexnlsSize1nIndexnlsSize2){if(lsPort1.at(nIndex)!lsPort2.at(nIndex)){// 比较两个被分割后的字符串同一位置returncompStringByHZ(lsPort1.at(nIndex),lsPort2.at(nIndex));}}// 若当前Index仅小于第二个字符串长度时elseif(nIndexnlsSize1nIndexnlsSize2){// 第一个字符串排在前面returntrue;}// 若当前Index仅小于第一个字串长度时elseif(nIndexnlsSize1nIndexnlsSize2){// 第二个字符串排在前面returnfalse;}}returnfalse;}boolsortByDiffChars::compStringByHZ(constQStringstr1,constQStringstr2){if(str1.isEmpty()||str2.isEmpty()){returnfalse;}boolbIsNum1false;boolbIsNum2false;intnNum1str1.toInt(bIsNum1);intnNum2str2.toInt(bIsNum2);if(bIsNum1bIsNum2){// 如果两个字符串都是数值型按逐位比较排序if(nNum1nNum2){returncompNumberString(str1,str2);}returnnNum1nNum2;}elseif(bIsNum1!bIsNum2){// 数值型排在前面returntrue;}elseif(!bIsNum1bIsNum2){// 数值型排在前面returnfalse;}else{// 字符串按汉字排序QLocalelocal(QLocale::Chinese);QCollatorcollator(local);return(collator.compare(str1,str2)0);}returnfalse;}boolsortByDiffChars::compNumberString(constQStringstr1,constQStringstr2){intnlsSize1str1.size();intnlsSize2str2.size();intnCountnlsSize1nlsSize2?nlsSize1:nlsSize2;for(intnIndex0;nIndexnCount;nIndex){if(nIndexnlsSize1nIndexnlsSize2){if(str1.at(nIndex)!str2.at(nIndex)){boolbIsNum1false;boolbIsNum2false;QString strNum1str1.at(nIndex);QString strNum2str2.at(nIndex);intnNum1strNum1.toInt(bIsNum1);intnNum2strNum2.toInt(bIsNum2);returnnNum1nNum2;}}elseif(nIndexnlsSize1nIndexnlsSize2){returntrue;}elseif(nIndexnlsSize1nIndexnlsSize2){returnfalse;}}returnfalse;}

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑