Regex模式比對字元串基礎知識_Regex

來源:互聯網
上載者:User
這篇文章主要介紹了Regex模式比對字元串基礎知識,分為匹配字串的基本規則和正則匹配、尋找與替代的知識,本文給大家介紹的非常不錯,需要的朋友可以參考下

介紹

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

  • 邏輯上很容易出錯

  • 很容易漏掉對一些邊界條件的檢查

  • 代碼複雜難以理解、維護

  • 效能差

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

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

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

  1. 匹配字串的基本規則

  2. 正則匹配、尋找與替代

本文介紹的Regex規則是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進行匹配、尋找或者替代。

正則匹配、尋找與替代

書寫好模式字串後,需要將待匹配的字串和模式字串進行一定規則的匹配。包括三種方式:匹配(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]+)\"\\)");

此時,在\\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的子串。

總結

以上所述是小編給大家介紹的Regex模式比對字元串基礎知識,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對topic.alibabacloud.com的支援!

相關推薦:

使用Regex驗證登入頁面輸入是否符合要求_Regex

Regex \w \d 的意義解答

使用Regex屏蔽關鍵字的方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.