您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關正則表達式模式匹配字符串基礎知識有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
匹配字符串的基本規則
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的子串。
關于“正則表達式模式匹配字符串基礎知識有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。