首頁>技術>

字串擷取我想每個程式猿不管是新手還是老手都很熟悉了,像C++裡的substr()方法就十分好用,但是這個方法需要知道你要擷取位置的起始位置和需要擷取的字串長度,又或者需要知道擷取的起始位置和停止位置。

背景

上面說的substr方法在擷取不確定長度字串和一次性擷取多段子字串時用起來不是很方便。小編就遇到這樣的問題,下面來詳細講講:

現在有一串格式固定但是長度不確定的字串,例如:set(“mill_ed.8.f_steptools.1.st_profile”, “face”, 50.800);這樣一個字串,他的結構是有規律的,都是由“.”分隔。

如上,我需要擷取標紅色的部分,其他部分都是固定的,按照常規方法我是可以先用“.”將字串分割,然後再有部分的再分別去擷取。但是我嫌麻煩,於是我就想到了正則表示式,想著能不能用正則去將我需要的字元匹配出來。

實現

直接上程式碼吧:

先看下執行結果吧:

怎麼樣一次性將所有需要的子字串全部截取出來了,是不是很方便快捷呢?(大家注意一下這裡,result容器內的第一項是匹配成功的整字串,後面的才是小括號中()匹配條件的子字串)。

詳解

接下來我們來了解一下C++正則的一些基本用法吧。我們在用C++的正則的時候需要引入regex庫#include<regex>,這個庫裡面有哪些東西呢?

這裡的函式和型別我就不講了,主要用到regex_match方法。然後將目標字串與你得正則表示式去匹配,得到的匹配結果全部在smatch型別的容器中。其中最終要的主要是regex正則表示式

regex pattern = regex("set\\\\(\\".*)\\\\.(\\\\d+)\\\\.(.*)\\\\.(\\\\d+)\\\\.st_profile\\",.*\\"([a-z]+)\\",(.*)\\\\).*");這裡是核心,這裡用到的正則知識其實都是最基本的,不是很複雜,如果有不懂得小夥伴自己去看下正則相關的知識,正則是與程式語言無關的都是通用的。大概講一下這裡用到的幾個萬用字元的意思:(截圖來源菜鳥教程)

需要特別說明的是你需要匹配出來的子字串的表示式一定要用小括號“()”括起來,不然的話匹配結果是不會進入到smatch容器裡去的,我們驗證一下,我將第一個子表示式的小括號“()”去掉我們看一下結果:regex pattern = regex("set\\\\(\\".*\\\\.(\\\\d+)\\\\.(.*)\\\\.(\\\\d+)\\\\.st_profile\\",.*\\"([a-z]+)\\",(.*)\\\\).*");

執行結果是:

我們看到結果與上一次比少了mill_ed這一項。

希望對大家有幫助,如果大家以後在處理字串有這種需求的話可以嘗試一下這種方法,我個人覺得用起來是很方便快捷的。最後給大家附上原始碼吧

#include <stdio.h>#include <iostream>#include <regex>using namespace std;int main(){\tstring str("set(\\"mill_ed.8.f_steptools.1.st_profile\\",\\"face\\", 50.800);");\tregex pattern = regex("set\\\\(\\"(.*)\\\\.(\\\\d+)\\\\.(.*)\\\\.(\\\\d+)\\\\.st_profile\\",.*\\"([a-z]+)\\",(.*)\\\\).*");\t\tsmatch result ;\tbool isMatch = regex_match(str,result,pattern);\tfor (int i = 0; i < result.size(); i++)\t{\t\tcout<<result[i]<<endl;\t}\tsystem("pause");\treturn 0 ;}

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 詳解分散式事務XA實現資料一致性的協議與原理--2PC與3PC