一直以來,使用正則表達式的機會很多,常常用來作一些字符串處理工做,仍是比較方便的,不過對於斷言和貪婪懶惰模式的認識一直比較模糊。最近咱們後端組在協做開發一個對外的後臺項目,前端的接口文檔是用word寫了(汗-_-||,很難用啊,仍是markdown比較好)裏面有一個接口列表的表格,這裏的接口列表須要提取出來,造成一個權限鏈路作權限控制,減小ajax的RBAC權限配置的臃腫。這裏我用了正則表達式來完成,作完以後我對正則表達式的理解和使用也算是小成了,下面我就說一下正則表達式幾種常見用法個人理解。前端
網上有《正則表達式30分鐘入門教程》珠玉在前,基礎知識我就很少說了,你們本身去看。ajax
分組
一、對於一些有必定模式或者以必定規律出現的字符串,咱們想要匹配而且捕獲到它們; 二、這些字符串咱們不但要匹配捕獲到它們,還要向後引用進行例如替換之類的處理; 正則表達式中分組的單位用(exp)小括號來區分,裏面exp就是要匹配的內容。正則表達式
匹配ip地址xxx.xxx.xxx.xxx能夠寫成如下形式後端
\d{1,3}(\.\d{1,3}){3}
匹配少數民族的真實姓名markdown
[\x{4e00}-\x{9fa5}]+(·[\x{4e00}-\x{9fa5}]+)*
(此處貼個畢加索的全名。。。[巴勃羅·迭戈·荷瑟·山迪亞哥·弗朗西斯科·德·保拉·居安·尼波莫切諾·克瑞斯皮尼亞諾·德·羅斯·瑞米迪歐斯·西波瑞亞諾·德·拉·山迪西瑪·特立尼達·瑪利亞·帕裏西奧·克里託·瑞茲·布拉斯科·畢加索])url
而正則表達式中默認第0個分組是匹配到整條正則表達式的字符串spa
分組命名:code
咱們還能夠給分組進行命名,方便區分教程
(?<name>exp)
匹配到exp的內容就會捕獲到一個命名爲name的分組裏面,不影響原來的索引分組狀況,也能夠寫成索引
(?'name'exp)
在向後引用中,咱們可使用 \n 或者 $n 來引用匹配到的分組內容,即第n個出現的小括號。
不捕獲:
在正則表達式中,咱們能夠選擇關閉對不須要的內容的捕獲,就是不捕獲,以此來提升正則表達式的執行速度和節約內存使用。 語法是:
(?:exp)
零寬斷言
零寬,顧名思義,就是沒有寬度,匹配到的字符串不會被捕獲。 斷言,就是true or false。
下面是4種斷言的說明:
名稱 | 語法 | 說明 |
---|---|---|
零寬度正先行斷言 | (?=exp) | 匹配到exp則中止 |
零寬度負先行斷言 | (?!exp) | 匹配不到exp則中止 |
零寬度正後發斷言 | (?<=exp) | 匹配到exp則繼續 |
零寬度負後發斷言 | (?<!exp) | 匹配不到exp則繼續 |
ps:千萬傻傻別去的記名稱,理解用法最重要
零寬斷言只是用來判斷是否符合繼續匹配的條件,並不會找到真正須要的字符串,自己並不會匹配字符
例如,在爬蟲中咱們可能須要匹配某些圖片url,咱們就能夠用斷言來獲取圖片url。
貪婪和懶惰模式
正則表達式中默認的行爲是在整個表達式可以匹配的前提下,匹配儘量多的字符,這稱之爲貪婪模式。 不過有時候,咱們還在整個表達式匹配的前提下儘量少的匹配字符,這就須要用到懶惰模式了。 懶惰模式的語法也簡單,只須要在你所需匹配的字符後面再加一個?便可。
語法 | 說明 |
---|---|
*? | 重複任意次,但儘量少重複 |
+? | 重複1次或更屢次,但儘量少重複 |
?? | 重複0次或1次,但儘量少重複 |
{n,}? | 重複n次以上,但儘量少重複 |
解釋:懶惰模式就是在你設想字符可能出現的次數中,儘量匹配少的次數。