正則分組,零寬斷言和貪婪懶惰模式

一直以來,使用正則表達式的機會很多,常常用來作一些字符串處理工做,仍是比較方便的,不過對於斷言和貪婪懶惰模式的認識一直比較模糊。最近咱們後端組在協做開發一個對外的後臺項目,前端的接口文檔是用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次以上,但儘量少重複

解釋:懶惰模式就是在你設想字符可能出現的次數中,儘量匹配少的次數。

相關文章
相關標籤/搜索