正則表達式入門簡單理解

2020-08-10 11:47:25

1.入門介紹

簡單的說,正則表達式是一種可以用於模式匹配和替換的強有力的工具。我們可以在幾乎所有的基於UNIX系統的工具中找到正則表達式的身影,例如,vi編輯器,Perl或PHP指令碼語言,以及awk或sed shell程式等。此外,象JavaScript這種用戶端的指令碼語言也提供了對正則表達式的支援。由此可見,正則表達式已經超出了某種語言或某個系統的侷限,成爲人們廣爲接受的概念和功能。

正則表達式可以讓使用者通過使用一系列的特殊字元構建匹配模式,然後把匹配模式與數據檔案、程式輸入以及WEB頁面的表單輸入等目標物件進行比較,根據比較物件中是否包含匹配模式,執行相應的程式。
  舉例來說,正則表達式的一個最爲普遍的應用就是用於驗證使用者線上輸入的郵件地址的格式是否正確。如果通過正則表達式驗證使用者郵件地址的格式正確,使用者所填寫的表單資訊將會被正常處理;反之,如果使用者輸入的郵件地址與正則表達的模式不匹配,將會彈出提示資訊,要求使用者重新輸入正確的郵件地址。由此可見正則表達式在WEB應用的邏輯判斷中具有舉足輕重的作用。

2.基本語法用法

/hard/

其中位於「/」定界符之間的部分就是將要在目標物件中進行匹配的模式。使用者只要把希望查詢匹配物件的模式內容放入「/」定界符之間即可。爲了能夠使使用者更加靈活的定製模式內容,正則表達式提供了專門的「元字元」。所謂元字元就是指那些在正則表達式中具有特殊意義的專用字元,可以用來規定其前導字元(即位於元字元前面的字元)在目標物件中的出現模式。

較爲常用的元字元包括: 「+」, 「*」,以及 「?」。

a. 「+」元字元規定其前導字元必須在目標物件中連續出現一次或多次
b. 「*」元字元規定其前導字元必須在目標物件中出現零次或連續多次
c. 「?」元字元規定其前導物件必須在目標物件中連續出現零次或一次

讓我們看看如何元字元的具體使用

/vo+/

因爲上述正則表達式中包含「+」元字元,表示可以與目標物件中的 「vool」, 「vo」, 或者 「vootball」等在字母f後面連續出現一個或多個字母o的字串相匹配。

/av*/

因爲上述正則表達式中包含「*」元字元,表示可以與目標物件中的 「asy」, 「ago」, 或者 「agg」等在字母e後面連續出現零個或多個字母g的字串相匹配。
/Wil?/
因爲上述正則表達式中包含「?」元字元,表示可以與目標物件中的 「Win」, 或者 「Wilson」,等在字母i後面連續出現零個或一個字母l的字串相匹配。

除了元字元之外,使用者還可以精確指定模式在匹配物件中出現的頻率。例如,
/jim{2,6}/
上述正則表達式規定字元m可以在匹配物件中連續出現2-6次,因此,上述正則表達式可以同jimmy或jimmmmmy等字串相匹配。

在對如何使用正則表達式有了初步瞭解之後,我們來看一下其它幾個重要的元字元的使用方式。
\s:用於匹配單個空格符,包括tab鍵和換行符;
\S:用於匹配除單個空格符之外的所有字元;
\d:用於匹配從0到9的數位;
\w:用於匹配字母,數位或下劃線字元;
\W:用於匹配所有與\w不匹配的字元;
. :用於匹配除換行符之外的所有字元。

(說明:我們可以把\s和\S以及\w和\W看作互爲逆運算)

除了我們以上所介紹的元字元之外,正則表達式中還具有另外一種較爲獨特的專用字元,即定位符。定位符用於規定匹配模式在目標物件中的出現位置。

較爲常用的定位符包括: 「^」, 「KaTeX parse error: Undefined control sequence: \b at position 5: 」, 「\̲b̲」 以及 「\B」。其中,「^…」定位符規定匹配模式必須出現在目標物件的結尾,\b定位符規定匹配模式必須出現在目標字串的開頭或結尾的兩個邊界之一,而「\B」定位符則規定匹配物件必須位於目標字串的開頭和結尾兩個邊界之內,即匹配物件既不能作爲目標字串的開頭,也不能作爲目標字串的結尾。同樣,我們也可以把「^」和「$」以及「\b」和「\B」看作是互爲逆運算的兩組定位符。舉例來說:

/^yoll/
因爲上述正則表達式中包含「^」定位符,所以可以與目標物件中以 「yell」, 「yello」或 「yellhound」開頭的字串相匹配。

/br// 因爲上述正則表達式中包含「」定位符,所以可以與目標物件中以 「cbr」, 「bbr」或 「br」 結尾的字串相匹配。

/\bbom/
因爲上述正則表達式模式以「\b」定位符開頭,所以可以與目標物件中以 「bomb」, 或 「bom」開頭的字串相匹配。

/man\b/
因爲上述正則表達式模式以「\b」定位符結尾,所以可以與目標物件中以 「human」, 「woman」或 「man」結尾的字串相匹配。

爲了能夠方便使用者更加靈活的設定匹配模式,正則表達式允許使用者在匹配模式中指定某一個範圍而不侷限於具體的字元。例如:

/[A-Z]/
上述正則表達式將會與從A到Z範圍內任何一個大寫字母相匹配。

/[a-z]/
上述正則表達式將會與從a到z範圍內任何一個小寫字母相匹配。

/[0-9]/
上述正則表達式將會與從0到9範圍內任何一個數字相匹配。

/([a-z][A-Z][0-9])+/
上述正則表達式將會與任何由字母和數位組成的字串,如 「aB0」 等相匹配。這裏需要提醒使用者注意的一點就是可以在正則表達式中使用 「()」 把字串組合在一起。「()」符號包含的內容必須同時出現在目標物件中。因此,上述正則表達式將無法與諸如 「abc」等的字串匹配,因爲「abc」中的最後一個字元爲字母而非數位。

如果我們希望在正則表達式中實現類似程式設計邏輯中的「或」運算,在多個不同的模式中任選一個進行匹配的話,可以使用管道符 「|」。例如:

/to|too|2/
上述正則表達式將會與目標物件中的 「to」, 「too」, 或 「2」 相匹配。

正則表達式中還有一個較爲常用的運算子,即否定符 「[^]」。與我們前文所介紹的定位符 「^」 不同,否定符 「[^]」規定目標物件中不能存在模式中所規定的字串。例如:

/[^A-C]/
上述字串將會與目標物件中除A,B,和C之外的任何字元相匹配。一般來說,當「^」出現在 「[]」內時就被視做否定運算子;而當「^」位於「[]」之外,或沒有「[]」時,則應當被視做定位符。

最後,當使用者需要在正則表達式的模式中加入元字元,並查詢其匹配物件時,可以使用跳脫符「\」。例如:

/Th*/
上述正則表達式將會與目標物件中的「Th*」而非「The」等相匹配。