正則表達式在咱們平時的工做中至關的經常使用,不管是寫jmeter腳本,或者寫自動化腳本,均可能會用到正則表達式。這篇文章主要梳理正則表達式的經常使用知識點,並結合一些具體的例子,讓你們能掌握使用正則表達式的正確姿式,以致於有打通「任督二脈」之效。html
正則表達式的功能歸納講主要有四個:java
正則表達式的特色,歸納起來是:python
由於語句的精簡,因此對於不少新手來講,正則表達式會顯得晦澀難懂。可是一旦你掌握它,將會大大提高你的工做效率,會讓不少複雜的代碼邏輯,變的精簡。mysql
何爲「引擎」?個人理解就是能驅動整個系統運轉,好比汽車發動機引擎,主要部件是氣缸,是整個汽車的動力源泉。一樣正則表達式引擎就是能驅動實現正則表達式功能(匹配、替換、提取)的程序,目前主流的正則表達式
可能你們會以爲比較難理解,畢竟比較偏理論。這裏和你們解釋下幾個關鍵字:算法
有窮:表示有限的意思,表示有限次數內能獲得結果。sql
自動機:其實起的名稱而已,能夠理解成引擎能根據規則自動匹配,不須要人爲干預。編程
肯定型和非肯定型: 假設有一個字符串(text=abc)須要匹配,在沒有編寫正則表達式的前提下,就直接能夠肯定字符匹配順序的就是肯定型,不能肯定字符匹配順序的則爲非肯定型。windows
爲了更直觀的讓你們理解NFA和DFA,從網上爬了兩種動圖(來自知乎—豬哥的Python)。(https://zhuanlan.zhihu.com/p/107836267)網絡
DFA引擎執行原理動圖以下所示:
NFA引擎執行原理動圖以下所示:
正則表達式由普通字符和元字符組成,其中普通字符主要就是咱們常見的字母、數字、漢字、下劃線以及沒有特殊含義的標點符號等。下面我幫你們歸類整理了常見的特殊字符(參考了菜鳥教程(https://www.runoob.com/regexp/regexp-tutorial.html)並增長了本身的理解)。
字符 | 描述 |
---|---|
\n | 匹配一個換行符 |
\t | 匹配一個製表符 |
\r | 匹配一個回車符 |
\s | 匹配任何空白字符,包括空格、製表符、換頁符等等 |
\S | 匹配任何非空白字符 |
\f | 匹配一個換頁符 |
\v | 匹配一個垂直製表符 |
字符 | 描述 |
---|---|
* 等價於 {0,} | 匹配前面的子表達式0次或屢次 |
+ 等價於 {1,} | 匹配前面的子表達式1次或屢次 |
? 等價於 {0,1} | 匹配前面的子表達式0次或1次 |
{n} | n是一個非負整數。匹配前面的子表達式n次 |
{n,m} | m和n均爲非負整數,而且n<=m,匹配前面的子表達式至少n次最多m次 |
{n,} | n是一個非負整數,匹配前面的子表達式至少n次 |
限定符主要用於對匹配內容數量的限制,注意我在上面表格中列出了三組等價關係的寫法。另外這裏還牽扯到一個知識點,貪婪匹配和非貪婪匹配:
舉個例子, 源字符串是aaabaaab,假如正則表達式是:.*b,則最終能匹配到:aaabaaab,這就是貪婪匹配。若是正則表達式加上?:.*?b,則最終能匹配到兩個aaab,相對來說這就是非貪婪匹配。
字符 | 描述 |
---|---|
\d 等價於 [0-9] | 匹配數字0到9之間的數字 |
\D 等價於 [ ^0-9] | 匹配非數字0到9的字符 |
\w 等價於 [A-Za-z_0-9] | 匹配包括下劃線的任何單詞字符 |
\W 等價於 [ ^A-Za-z_0-9] | 匹配非下劃線、單詞字符 |
\s 等價於[ \f\n\r\t\v] | 匹配任何的非打印字符 |
\S 等價於[ ^\f\n\r\t\v] | 匹配任何的打印字符 |
. | 匹配除了\n以外的任意單個字符 |
須要注意在上面表格中分別列出了等價寫法,主要是爲了方便你們的理解和記憶。
字符 | 描述 |
---|---|
^ | 匹配輸入字符串開始的位置 |
$ | 匹配輸入字符串結尾的位置 |
\b | 匹配一個單詞邊界,即字與空格間的位置 |
\B | 非單詞邊界匹配 |
^和$應該比較好理解,\b和\B表示的是單詞的邊界,咱們後面會經過具體的例子來幫助你們理解它的含義。
字符 | 描述 |
---|---|
(pattern) | 匹配pattern並獲取這一匹配。所獲取的匹配能夠從產生的Matches集合獲得 (結果會被存儲起來),須要注意的是,若是要匹配括號,須要使用轉義字符'(' 或 ')'。 |
\number | 反向引用,能夠在正則表達式中利用數字下標number引用()分組的Matchers集合的內容,好比: 源字符串是abcdebbcde,正則表達式是:([ab])\1,最終會匹配到bb。 |
a|b | 匹配字符串a或者b,是「或」的關係 |
(?:pattern) | 匹配pattern,可是並不獲取匹配結果(和上面的(pattern有區別))。也就是說不將匹配結果 存儲起來,供後面能夠獲取使用。好比:源字符串是:industry|indestries,正則表達式是industr(?:y|ies),最終能匹配到industry和indestries。 |
(?=pattern) | 正向確定預查,在任何匹配pattern的字符串開始處匹配查找字符串, 可是不獲取匹配結果,且不消耗字符串。好比:源字符串是:Windows2000,正則表達式是Windows(?=95|98|NT|2000),最終能匹配的是:windows。若是源字符串是:Windows3.1,則不能匹配。 |
(?!pattern) | 正向否認預查,在任何不匹配pattern的字符串開始處匹配查找字符串, 可是不獲取匹配結果,且不消耗字符串。這個正好和(?!pattern)是相反的。好比:源字符串是:Windows3.1,正則表達式仍是:Windows(?=95|98|NT|2000),則最終能匹配到字符串:Windows。 |
(?<=pattern) | 逆向確定預查,與正向確定預查相似,只是方向相反。好比:源字符串是:2000Windows,正則表達式是:(?<=95|98|NT|2000)Windows,能匹配到字符串Windows。一樣的若是源字符串是3.1Windows,則不能匹配。 |
(?<!pattern) | 逆向否認預查,與正向否認預查相似,只是方向相反。好比:源字符串是:3.1Windows,正則表達式是:(?<=95|98|NT|2000)Windows,一樣的若是源字符串是2000Windows,就沒法匹配。 |
正則表達式從左到右進行計算,並遵循優先級順序,這跟你們常見的算術表達式很是相似。相同優先級的從左到右進行運算,不一樣優先級的運算先高後低。下表中的優先級是從高到低排列。
字符 | 描述 |
---|---|
\ | 轉義字符 |
(), (?😃, (?=), [] | 圓括號和方括號 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \任何元字符、任何字符 | 定位點和序列(即:位置和順序) |
| | 或操做 |
文中主要梳理了正則表達式的基礎知識點,我的以爲你們徹底不必記憶,只須要在使用的時候能知道用什麼便可。而後再來翻閱這篇文章中幫你們總結的知識點。