幫你梳理正則表達式的基礎知識

正則表達式在咱們平時的工做中至關的經常使用,不管是寫jmeter腳本,或者寫自動化腳本,均可能會用到正則表達式。這篇文章主要梳理正則表達式的經常使用知識點,並結合一些具體的例子,讓你們能掌握使用正則表達式的正確姿式,以致於有打通「任督二脈」之效。html

理論知識

概念

  • 正則表達式是對字符串操做的一種邏輯公式,就是用事先定義好的一些特定字符串、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。
  • 正則表達式的英文是:Regular Expression,即「描述某種規則的表達式」之意。因此在不少編程語言中,都以regex、regexp等命名正則表達式模塊,好比在Python中定義了re模塊用於處理正則表達式。

正則表達式發展史

  • 正則表達式最先追溯至1940年代科學家對人類神經系統的工做原理的研究,使用數學方法(數學符號)來描述神經網絡。當時,美國新澤西州的Warren McCulloch和出生在美國底特律的Walter Pitts這兩位神經生理方面的科學家,研究出了一種用數學方式來描述神經網絡的新方法,他們創新地將神經系統中的神經元描述成了小而簡單的自動控制元,從而做出了一項偉大的工做革新。你們能夠想象下,爲啥正則表達式會起源於神經網絡?
  • 隨後,大名鼎鼎的Unix之父——Ken Thompson於1968年發表了文章《正則表達式搜索算法(Regular Expression Search Algorithm)》,而且將正則表達式這一符號系統引入了他本身開發的編輯器qed以及以後的編輯器ed中,而後又被移植到了大名鼎鼎的文本搜索工具grep中。自此,正則表達式被普遍應用到各類Unix系統或類Unix系統(如Mac系統、Linux系統)的工具中。
  • 因爲正則表達式異常強大而實用的功能,愈來愈多的語言和工具引入了正則表達式。不過遺憾的是,始終沒有確立正則表達式方面的標準,致使各語言與工具中的正則表達式雖然功能上大致相似,但細微差異仍然很多。因而,誕生於1986年的POSIX開始進行標準化的嘗試。
  • 1988年6月,Larry Wall開發的Perl語言發佈第2版,其中所引入的正則表達式引擎大放異彩。Perl 2的正則表達式引擎源於Henry Spencer編寫的regex的加強版。
  • 以後,正則表達式在各類計算機語言或各類應用領域進一步獲得了更爲普遍而廣泛的應用和發展。

功能

正則表達式的功能歸納講主要有四個:java

  • 匹配給定的文本。
  • 經過正則表達式,能夠提取咱們指望獲得的文本。
  • 替換指定的文本。
  • 根據給定的文本,將字符串切分成多個子串。

特色

正則表達式的特色,歸納起來是:python

  • 靈活性、邏輯性和功能性很是強。
  • 能夠用很是精簡的語句,來操做字符串。

由於語句的精簡,因此對於不少新手來講,正則表達式會顯得晦澀難懂。可是一旦你掌握它,將會大大提高你的工做效率,會讓不少複雜的代碼邏輯,變的精簡。mysql

正則表達式引擎

何爲「引擎」?個人理解就是能驅動整個系統運轉,好比汽車發動機引擎,主要部件是氣缸,是整個汽車的動力源泉。一樣正則表達式引擎就是能驅動實現正則表達式功能(匹配、替換、提取)的程序,目前主流的正則表達式

  • NFA (Non-deterministic finite automaton) : 非肯定型有窮自動機 ,以表達式爲基礎,遍歷字符串查找匹配。使用NFA引擎的程序有:java、less、more、python、sed、vi、grep等。
  • DFA( Deterministic finite automaton ):肯定型有窮自動機,以文本爲基礎,遍歷字符串,查找匹配表達式。使用DFA引擎的程序有:awk、egrep、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} 限定符
^, $, \任何元字符、任何字符 定位點和序列(即:位置和順序)
| 或操做

總結

文中主要梳理了正則表達式的基礎知識點,我的以爲你們徹底不必記憶,只須要在使用的時候能知道用什麼便可。而後再來翻閱這篇文章中幫你們總結的知識點。

相關文章
相關標籤/搜索