收藏本站 收藏本站
積木網首頁 - 軟件測試 - 常用手冊 - 站長工具 - 技術社區
首頁 > 正則表達式 > 正文

首頁 - PHP - 數據庫 - 操作系統 - 游戲開發 - JS - Android - MySql - Redis - MongoDB - Win8 - Shell編程 - DOS命令 - jQuery - CSS樣式 - Python - Perl

Access - Oracle - DB2 - SQLServer - MsSql2008 - MsSql2005 - Sqlite - PostgreSQL - node.js - extjs - JavaScript vbs - Powershell - Ruby

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

介紹

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

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

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

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

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

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

本文介紹的正則表達式規則是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的子串。

總結

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

python 正則表達式 re.sub & re.subn
python正則表達式模塊簡介Python自1.5版本起增加了re模塊,它提供Perl風格的正則表達式模式。Python1.5之前版本則是通過regex模塊提供Emacs風格的模式。Emacs

mysql update正則替換sql語句
下面的update語句執行的是把www.test.com中的test替換為abc程序代碼例句:UpdatetestSETurl=REPLACE('www.test.com','test','abc')WhereurlREGEXPwww.test.com;如果在記錄中,有類

MySQL中REGEXP正則表達式使用大全
以前我要查找數據都是使用like后來發現mysql中也有正則表達式了并且感覺性能要好于like,下面我來給大家分享一下mysqlREGEXP正則表達式使用詳解,希望

本周排行

更新排行

強悍的草根IT技術社區,這里應該有您想要的! 友情鏈接:b2b電子商務
Copyright © 2010 Gimoo.Net. All Rights Rreserved  京ICP備05050695號
手游棋牌游戏运营
七星彩超准计算公式 重庆时时开奖结果记录官 中国湖南福利彩票开奖结果 云南快乐十分钟 赛车h 重庆时时现场开奖直播 上海快三跨度走势一定牛 香港tm4特马分分析 湖北今天快三 广东时时网点 四九论坛推荐公式规律 时时万能缩水手机版 安徽快3走势图今天 河北时时一定牛推荐号 彩票三地走势图综合版 广西快乐十分下载软件