国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

正則表達式模式怎么匹配字符串

來源:懂視網 責編:小采 時間:2020-11-27 19:57:52
文檔

正則表達式模式怎么匹配字符串

正則表達式模式怎么匹配字符串:這次給大家帶來正則表達式模式怎么匹配字符串,正則表達式模式匹配字符串的注意事項有哪些,下面就是實戰案例,一起來看一下。 介紹 在實際項目中有個功能的實現需要解析一些特定模式的字符串。而在已有的代碼庫中,在已實現的部分功能中,都是使用檢測特定的
推薦度:
導讀正則表達式模式怎么匹配字符串:這次給大家帶來正則表達式模式怎么匹配字符串,正則表達式模式匹配字符串的注意事項有哪些,下面就是實戰案例,一起來看一下。 介紹 在實際項目中有個功能的實現需要解析一些特定模式的字符串。而在已有的代碼庫中,在已實現的部分功能中,都是使用檢測特定的

這次給大家帶來正則表達式模式怎么匹配字符串,正則表達式模式匹配字符串的注意事項有哪些,下面就是實戰案例,一起來看一下。

介紹

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

  • 邏輯上很容易出錯

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

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

  • 性能差

  • 看到代碼庫中有一個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]+)\"\\)");

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

    相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

    推薦閱讀:

    正則表達式的\D元字符(等價于"[^0-9]")使用詳解

    正則的元字符和普通字符

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    正則表達式模式怎么匹配字符串

    正則表達式模式怎么匹配字符串:這次給大家帶來正則表達式模式怎么匹配字符串,正則表達式模式匹配字符串的注意事項有哪些,下面就是實戰案例,一起來看一下。 介紹 在實際項目中有個功能的實現需要解析一些特定模式的字符串。而在已有的代碼庫中,在已實現的部分功能中,都是使用檢測特定的
    推薦度:
    標簽: 模式 匹配 字符串
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 性xxxxfreexxxxx国产 | 九九福利| 久久精品无遮挡一级毛片 | 成年全黄大色大黄 | 欧美在线视频一区二区 | 一区二区三区在线 | 欧美亚洲国产精品第一页 | 欧美精品久久久久久久久大尺度 | 亚洲精品国产成人99久久 | 伊人婷婷 | 亚洲视频在线免费看 | 国产精品久久二区三区色裕 | a一级毛片| 国产精品久久毛片蜜月 | 欧美三级一区二区 | 久久久毛片 | 美女一级毛片免费观看 | 毛片免费网 | 一区二区精品在线 | 久久精品视频一区二区三区 | 日韩欧美国产中文 | a集毛片| 欧美日韩成人在线视频 | 国产一区二区高清视频 | 一区二区电影 | 免费一看一级毛片全播放 | 免费看特级淫片日本 | 欧美激情一区二区三区不卡 | 国产欧美日韩精品第二区 | 国产欧美一区二区三区视频 | 欧美 亚洲 另类 热图 | 91精品国产91久久综合 | 日本黄 色 成 年 人免费观看 | 2021国产成人精品久久 | 精品一区二区三区四区五区六区 | 中文字幕日韩有码 | 福利视频欧美一区二区三区 | 精品欧美一区二区在线观看 | 热久久国产欧美一区二区精品 | 日韩大片在线观看 | 久久久高清国产999尤物 |