亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > regex > 正文

正則表達式模式匹配字符串基礎知識

2020-01-20 22:00:44
字體:
來源:轉載
供稿:網友

 介紹

      在實際項目中有個功能的實現需要解析一些特定模式的字符串。而在已有的代碼庫中,在已實現的部分功能中,都是使用檢測特定的字符,使用這種方法的缺點是:

  • 邏輯上很容易出錯
  • 很容易漏掉對一些邊界條件的檢查
  • 代碼復雜難以理解、維護
  • 性能差

      看到代碼庫中有一個cpp,整個cpp兩千多行代碼,有個方法里,光解析字符串的就有400余行!一個個字符對比過去,真是不堪入目。而且上面很多注釋都已經過期,很多代碼的書寫風格也各不相同,基本可以判斷是過了很多人手的。

      在這種情況下,基本沒辦法還沿著這條老路走下去,自然而然就想到了使用正則表達式。而我自己在正則表達式方面沒有實際應用的經驗,尤其是對于書寫匹配規則也是一知半解。第一時間就想到從網上找點資料,先大致了解下。但是度娘的結果依舊還是讓人很失望。(當然,如果是想要查找一些比較專業的知識,度娘的結果每次都會讓人心碎,無不都是千篇一律的拷貝。但是通常度娘生活方面的還是可以)后來就放棄度娘的查詢結果,FQ到了外面去找,也找到了一些比較基礎的視頻(需FQ)。

      這篇文章可以說是一個總結,把在書寫正則表達式的匹配字符串方面的基礎知識介紹一下。主要分為以下兩個個部分:

  1. 匹配字符串的基本規則
  2. 正則匹配、查找與替代

本文介紹的正則表達式規則是ECMAScript。使用的編程語言是C++。其他方面的不做介紹。

匹配字符串的基本規則

1. 匹配固定的字符串

regex e("abc");

2. 匹配固定字符串,不區分大小寫

regex e("abc", regex_constants::icase);

3. 匹配固定字符串之外多一個字符,不區分大小寫

regex e("abc.", regex_constants::icase);  // .  Any character except newline. 1個字符

4. 匹配0個或1個字符

regex e("abc?");    // ?  Zero or 1 preceding character. 匹配?前一個字符

5. 匹配0個或多個字符

regex e("abc*");    // *  Zero or more preceding character. 匹配*前一個字符

6. 匹配1個或多個字符

regex e("abc+");    // +  One or more preceding character. 匹配+前一個字符

7. 匹配特定字符串中的字符

regex e("ab[cd]*");    // [...] Any character inside square brackets. 匹配[]內的任意字符

8. 匹配非特定字符串的字符

regex e("ab[^cd]*");    // [...] Any character not inside square brackets. 匹配非[]內的任意字符

9. 匹配特定字符串,且指定數量

regex e("ab[cd]{3}");    // {n}  匹配{}之前任意字符,且字符個數為3個

10. 匹配特定字符串,指定數量范圍

regex e("ab[cd]{3,}");  // {n} 匹配{}之前任意字符,且字符個數為3個或3個以上regex e("ab[cd]{3,5}");  // {n} 匹配{}之前任意字符,且字符個數為3個以上,5個以下閉區間

11. 匹配規則中的某一個規則

regex e("abc|de[fg]");    // |  匹配|兩邊的任意一個規則

12. 匹配分組

regex e("(abc)de+");    // ()       ()表示一個子分組

13. 匹配子分組

regex e("(abc)de+//1");  // ()    ()表示一個子分組,而/1表示在此位置匹配第一個分組的內容regex e("(abc)c(de+)//2//1");  // /2 表示的是在此匹配第二個分組的內容

14. 匹配某個字符串開頭

regex e("^abc."); // ^ begin of the string 查找以abc開頭的子字符串

15. 匹配某個字符串結尾

regex e("abc.$");// $ end of the string 查找以abc結尾的子字符串

      以上是最基本的匹配模式的書寫。通常如果要匹配特定的字符,需要使用/進行轉義,比如在匹配字符串中需要匹配".",那么在匹配字符串中應該在特定字符前加上/。出了以上的基本規則,如果還不滿足特定的需要,那么可以參考此鏈接。使用了解基本的匹配模式后,需要使用正則表達式進行匹配、查找或者替代。

正則匹配、查找與替代

      書寫好模式字符串后,需要將待匹配的字符串和模式字符串進行一定規則的匹配。包括三種方式:匹配(regex_match)、查找(regex_search)、替換(regex_replace)。

      匹配很簡單,直接將待匹配字符串和模式字符串傳入到regex_match中,返回一個bool量來指明待匹配的字符串是否滿足模式字符串的規則。匹配整個str字符串。

bool match = regex_match(str, e);// 匹配整個字符串str

      查找是在整個字符串中找到和滿足模式字符串的子字符串。也就是只要str中存在滿足模式字符串就會返回true。

bool match = regex_search(str, e);// 查找字符串str中匹配e規則的子字符串

      但是很多情況下,光是返回一個是否匹配的bool量是不夠的,我們需要拿到匹配的子字符串。那么就需要在模式字符串中將匹配字符串分組,參考【匹配字符串的基本規則】第12點。再將smatch傳入到regex_search中,就可以獲得滿足每個子分組的字符串。

smatch m;bool found = regex_search(str, m, e);for (int n = 0; n < m.size(); ++n)  {    cout << "m[" << n << "].str()=" << m[n].str() << endl;  }

    替換也是基于模式字符串在分組情況下完成的。

cout << regex_replace(str, e, "$1 is on $2");

      此時,會在滿足分組1和分組2的字符串中間加上“ is on”。

      以上三個函數有很多版本的重載,可以滿足不同情況下的需求。

實戰

      要求:找出滿足sectionA("sectionB")或者sectionA ("sectionB")的模式字符串。且分離出sectionA、sectionB。sectionA和sectionB不會出現數字,字符可大小寫,至少有一個字符。

      分析:根據要求,大致可分為兩個部分,也就是sectionA和sectionaB。這是就需要用到分組。

第一步:寫出滿足section情況的模式字符串

[a-zA-Z]+

第二步:在sectionA和sectionB中可能會出現空格。暫且假設至多有1個空格

//s?

將以上兩個情況組合起來,也就是能滿足我們需求的模式字符串。但是如何組織才能讓其分為兩組呢?

[a-zA-Z]+//s[a-zA-Z]+

上面這種寫法肯定不對的,根據分組規則,需要將分組以()進行區分

regex e("([a-zA-Z]+)//s?//(/"([a-zA-Z]+)/"http://)");

      此時,在//s?后面的//(/"是為了滿足sectionB外層的引號和括號進行的轉義。

      以上完成后,可先用regex_match進行匹配,如果匹配,那么繼續使用regex_search對字符串進行查找

if (regex_match(str, e)){ smatch m; auto found = regex_search(str, m, e); for (int n = 0; n < m.size(); ++n) { cout << "m[" << n << "].str()=" << m[n].str() << endl; }}else{ cout << "Not matched" << endl;}

      對象m數組的第一個字符串是滿足需求的整個子串,接下來才是滿足分組1、分組2的子串。

總結

以上所述是小編給大家介紹的正則表達式模式匹配字符串基礎知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
浅井舞香一区二区| 欧美成aaa人片在线观看蜜臀| 亚洲欧美中文字幕| 亚洲视频在线观看免费| 精品久久久久久中文字幕| 欧美专区国产专区| 欧美精品在线看| 欧美日韩在线视频一区二区| 日韩在线一区二区三区免费视频| 国产亚洲欧美一区| 国产69精品久久久久99| 精品国产美女在线| 国产精品极品美女在线观看免费| 欧洲亚洲免费视频| 亚洲精品一区二区三区婷婷月| 91中文字幕在线观看| 国产一区二区三区在线免费观看| 91天堂在线观看| 日本aⅴ大伊香蕉精品视频| 揄拍成人国产精品视频| 亚洲二区在线播放视频| 亚洲天堂色网站| 欧美疯狂xxxx大交乱88av| 精品国产视频在线| 九九综合九九综合| 久久久久久国产| 日韩精品丝袜在线| 在线观看久久av| 911国产网站尤物在线观看| 国外成人在线视频| 成人国产在线视频| 国产欧美一区二区三区在线看| 国产亚洲一区二区在线| 久久欧美在线电影| 国产精品久久99久久| 国产日韩欧美黄色| 亚洲视频999| 日韩av三级在线观看| 成人免费淫片视频软件| 久久久人成影片一区二区三区观看| 国产精品69精品一区二区三区| 久久精品国产99国产精品澳门| 午夜精品福利视频| 亚洲天堂一区二区三区| 亚洲视频免费一区| 精品视频久久久| 国产成人综合久久| 中文字幕日韩精品在线| 最近2019年日本中文免费字幕| 欧美黄色片免费观看| 日韩大陆毛片av| 欧美视频免费在线| 中文字幕亚洲欧美一区二区三区| 国产精品久久婷婷六月丁香| 色噜噜久久综合伊人一本| 91精品久久久久久久久久久| 国产亚洲精品高潮| 久久综合色88| 久久夜色精品国产欧美乱| 热99在线视频| 欧美日韩免费观看中文| 国产成人激情视频| 欧美最近摘花xxxx摘花| 久久久久亚洲精品国产| zzjj国产精品一区二区| 最近2019好看的中文字幕免费| 91视频-88av| 国产视频自拍一区| 一本大道香蕉久在线播放29| 亚洲国产精品高清久久久| 精品久久久久久亚洲国产300| 精品呦交小u女在线| 欧美日韩国产一区二区| www国产精品com| 伊人青青综合网站| 欧美亚洲国产成人精品| 久久国产一区二区三区| 精品成人久久av| 欧美亚洲国产视频| 欧美在线一级视频| 亚洲欧美变态国产另类| 久久久亚洲国产天美传媒修理工| 欧美色播在线播放| 欧美大片va欧美在线播放| 97香蕉超级碰碰久久免费软件| 91日韩在线视频| 日韩a**站在线观看| 中文日韩在线视频| 国产丝袜一区二区三区免费视频| 成人免费视频97| 欧美日韩综合视频网址| 久久亚洲国产精品| 亚洲欧美在线一区| 亚洲一级片在线看| 日韩人体视频一二区| 欧美国产日韩一区二区| 国产精品美女视频网站| 欧美激情视频在线观看| 欧美—级a级欧美特级ar全黄| 久久97久久97精品免视看| 黑人精品xxx一区一二区| 亚洲人成在线电影| 精品久久久国产精品999| 欧美电影在线播放| 亚洲欧美成人一区二区在线电影| 国产欧美精品xxxx另类| 日韩欧美国产网站| 国产日韩欧美另类| 欧美国产第一页| 亚洲国产成人91精品| 免费91在线视频| 91超碰中文字幕久久精品| 欧美精品999| 日韩av在线免费| 国产日韩专区在线| 亚洲va男人天堂| 中文在线资源观看视频网站免费不卡| 97精品一区二区视频在线观看| 亚洲影院高清在线| 久久久精品免费| 亚洲第一区在线| 国产亚洲成精品久久| 欧美一区二三区| 国产精品欧美风情| 国产精品欧美日韩一区二区| 欧美激情久久久| 国产精品入口免费视| 日韩精品免费一线在线观看| 欧美精品中文字幕一区| 97视频com| 国产精品久久久久久久久久小说| 国产女人18毛片水18精品| 欧美另类精品xxxx孕妇| 国产亚洲精品久久久久动| 久久激情五月丁香伊人| 亚洲国产成人精品电影| 亚洲free性xxxx护士hd| 最近2019好看的中文字幕免费| 日韩中文有码在线视频| 欧美亚洲第一页| 91av中文字幕| 九色精品免费永久在线| 8x海外华人永久免费日韩内陆视频| 粉嫩av一区二区三区免费野| 91av在线国产| 国语自产精品视频在线看抢先版图片| 欧美裸体男粗大视频在线观看| 国产美女91呻吟求| 欧美成年人视频网站| 欧美日韩国产色| 亚洲精品国产精品国自产在线| 国产精品久久久久一区二区| 国产99视频精品免视看7| 国产aⅴ夜夜欢一区二区三区| 欧美激情精品久久久久久| 国产亚洲欧洲高清| 日韩免费av在线| 日韩精品免费综合视频在线播放| 欧美高清视频免费观看| 国产精品第三页| 精品国产欧美一区二区五十路| 日韩av电影国产| 国产精品视频久| 国产一区二区久久精品|