正則表達式用法簡介與速查

  1. 基本元字符

元字符 說明 舉例說明
. 匹配任意單個字符(換行符除外) c.t 匹配:全部c和t之間隔一個字符的文本,如:cat, cbt, cct, ...
[] 匹配字符集合中的一個字符 [abc] 匹配:a或b或c
[^] 對字符集合求非 [^abc] 匹配:「非a非b非c」的任意字符
- 定義一個區間 [A-Z] 匹配:字母A,B,C,...,Z中的任意一個字符
\ 對下一個字符轉義 須要轉義的字符: . [ ] ^ - \ * ? + ! { } $ ( )

 

  2. 特殊元字符

元字符 說明 補充說明
\d 匹配任意一個數字字符 等價於[0-9]
\D \d 的反義,匹配一個任意非數字字符 等價於[^0-9]
\w 匹配任意一個「字母數字下劃線」字符 等價於[A-Za-z0-9_]    (最新的實現中可匹配一個漢字)
\W \w 的反義,匹配任意一個「非字母非數字非下劃線」字符 等價於[^A-Za-z0-9_]
\f 匹配一個換頁符 (屬於空白字符)
\n 匹配一個換行符 (屬於空白字符)
\r 匹配一個回車符 (屬於空白字符)
\t 匹配一個製表符 (屬於空白字符)
\v 匹配一個垂直製表符 (屬於空白字符)
[\b] 匹配一個退格字符 不經常使用(屬於空白字符)
\s 匹配一個空白字符 包括上面的:\f, \n, \r, \t, \v, 注意:不包括[\b]
\S \s 的反義,匹配任意一個非空白字符, 非 \f, \n, \r, \t, \v, 的任意字符
\cx 匹配一個控制字符 不經常使用,x爲一個字母,用來表示特定的控制符。如:\cM 匹配 Control-M或回車符
\xn 用一個ASCII字符的十六進制值去匹配這個ASCII字符 不經常使用,n爲十六進制數表示
\0n 用一個ASCII字符的八進制值去匹配這個ASCII字符 不經常使用,n爲八進制數表示

 

  3. 次數元字符

元字符 說明 舉例說明
* 匹配前一個字符(或子表達式)的 0 次或 屢次重複 cat* 匹配:ca, cat, catt, cattt, ...
+ 匹配前一個字符(或子表達式)的 1 次或 屢次重複 cat+ 匹配:cat, catt, cattt, ...
? 匹配前一個字符(或子表達式)的 0 次或 1 次重複 cat? 匹配:ca, cat
{n} 匹配前一個字符(或子表達式)的 n 次重複 cat{3} 匹配:cattttt
{n, } 匹配前一個字符(或子表達式)的至少 n 次重複 cat{3,} 匹配:cattt, catttt, cattttttt, ...
{n, m} 匹配前一個字符(或子表達式)的 至少 n 次且至多 m 次重複 cat{3,5} 匹配:cattt, catttt, cattttt
*? * 的懶惰版本 cat*? 懶惰匹配:t 的 0 次或 屢次重複
+? + 的懶惰版本 cat+? 懶惰匹配:t 的 1 次或 屢次重複
{n, }? {n, } 的懶惰版本 cat{3,} 懶惰匹配:t 的至少 3 次重複

 

  4. 位置元字符

元字符 說明 補充說明
\b 匹配單詞的邊界 \b 的判斷依據是:位置兩邊分別爲 \w 和 \W
\B \b 的反義,匹配非邊界 \B 的判斷依據是:位置兩邊同爲 \w 或同爲 \W
\< 匹配單詞的開頭 (擴展的正則表達式,egrep支持)
\> 匹配單詞的結束 (擴展的正則表達式,egrep支持)
^ 匹配字符串的開頭 通常將整段文本視爲一個字符串,能夠和分行匹配模式組合使用
$ 匹配字符串的結尾 通常將整段文本視爲一個字符串,能夠和分行匹配模式組合使用
\A 匹配字符串的開頭 同 ^,但不受分行匹配影響
\z 匹配字符串的結尾 同 $,但不受分行匹配影響
(?m) 分行匹配模式 (不少正則表達式實現不支持)

 

  5. 子表達式與回溯

元字符 說明 補充說明
() 定義一個子表達式 子表達式在一些文檔中有時也稱爲 pattern(模式)
| 邏輯或操做 通常用在子表達式內,如:(ab|cd) 表示匹配 ab 或 cd
\1 匹配第1個子表達式 \1 表示左起第1個子表達式,\2 表示第2個子表達式,依此類推
?(n) 條件回溯(if then) 若是第n個子表達式中的內容存在,則匹配判斷條件以後的內容
?(n)| 條件回溯(if then else) 相似上面,then 要執行的內容與 else 要執行的內容之間,用 | 隔開。

 

  6. 先後查找

元字符 說明 舉例說明
(?=) 向前查找(原字符串中,真正匹配內容在前面,條件在後面) \d+(?=a) 匹配:以 a 結尾的數字,但 a 自己不在返回文字中
(?<=) 向後查找(原字符串中,真正匹配內容在後面,條件在前面) (?<=a)\d+ 匹配:以 a 開頭的數字,但 a 自己不在返回文字中
(?!) 負向前查找(將向前查找的「=」換成「!」) 向前查找的否認形式,\d+(?!a) 匹配:不以 a 結尾的數字,
(?<!) 負向後查找(將向後查找的「=」換成「!」) 向後查找的否認形式,(?<!a)\d+ 匹配:不以 a 開頭的數字,

 

  7. 經常使用正則表達式示例

IP地址 (((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3} ((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))
Email地址 (\w+\.)*\w+@(\w+\.)+[A-Za-z]+
URL地址 https?://[-\w\.]+(:\d+)?(/([\w/_.]*)?)?
HTML註釋 <!-{2,}.*?-{2,}>
Js註釋 //.*
驗證整數 ^-?\d+$
驗證非負整數 ^\d+$
驗證正整數 ^\+?[1-9]\d*$ 
驗證浮點數 ^(-?\d+)(\.\d+)?$ 
匹配unicode漢字 [\u4e00-\u9fa5]  (不包括中文標點符號)

 

  8. Python 中使用正則表達式的方法及示例

點擊標題,跳轉到下文詳細說明。javascript

 

  9. JavaScript 中使用正則表達式的方法及示例

點擊標題,跳轉到下文詳細說明。html

 

 

 

1. 基本元字符用法簡單說明

(1) 匹配單個字符java

示例文本python

sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

正則表達式正則表達式

sales.

匹配結果數組

sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

解釋:函數

匹配以「sales」開頭,後跟任意一個字符的6字符組合。ui

 

(2) 使用轉義字符spa

示例文本3d

sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

正則表達式

sales.\.xls

匹配結果

sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

解釋:

匹配以「sales」開頭,後跟任意一個字符,再後以「.xls」結尾的10字符組合。

 

(3) 匹配字符中的某一個

示例文本

a1.txt, b1.txt, c1.txt, d1.txt

正則表達式

[ac]1

匹配結果

a1.txt, b1.txt, c1.txt, d1.txt

解釋:

匹配以「a」或「c」開頭,後跟字符「1」的2字符組合。

 

(4) 特定字母可大小寫

示例文本

The phrase is RegEx or regex, but not regEx.

正則表達式

[Rr]eg[Ee]x

匹配結果

The phrase is RegEx or regex, but not regEx

解釋:

匹配 regex,其中第1個字符r大小寫皆可,第4個字符e大小寫皆可。

 

(5) 定義區間匹配

用法:

[a-z]可匹配全部小寫字母,[A-Z]可匹配全部大寫字母,[0-9]可匹配全部數字。

注意:若是要匹配全部大小寫字母,要寫成:[A-Za-z],而不能寫成:[A-z](由於其中會包含一些 ASCII符號)。

示例文本

a1.txt, b1.txt c2.txt, d3d.txt, ee.txt

正則表達式

[a-z][0-9].txt

匹配結果

a1.txt, b1.txt, c2.txt, d3d.txt, ee.txt

解釋:

匹配:第1個字符爲小寫字母,第2個字符爲數字,最後以「.txt」結尾。

 

(6) 組合使用

示例文本

background-color="#A2A2A2"; color="#000000"

正則表達式

#[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]

匹配結果

background-color="#A2A2A2"; color="#000000"

解釋:

對於十六進制數,每位的定義範圍爲0~9,A,B,C,D,E,F,在上面的正則表達式中使用[A-Fa-f0-9], 重複6次,便可獲得一個6位的十六進制數的匹配。(在後面第3小節介紹完次數匹配後,本例有更爲簡潔的寫法。)

 

(7) 取非匹配

示例文本

a1.txt, b2.txt, C3.txt, cc.txt, dd.txt

正則表達式

[a-z][^0-9].txt

匹配結果

a1.txt, b2.txt, C3.txt, cc.txt, dd.txt

解釋:

匹配:第1個字符爲小寫字母,第2個字符不是數字,最後以「.txt」結尾。

 

 

 

 

2. 特殊元字符用法簡單說明

(1) 匹配換行

說明:

在Windows下,換行用 \r\n 表示;在Linux下,換行僅用一個 \n 表示。

示例文本(Windows下文本)

001, Tom,  Male
002, Tina, Female

003, Jack, Male

正則表達式

\r\n\r\n

匹配結果

001, Tom,  Male
002, Tina, Female 
                  
003, Jack, Male

解釋:

匹配Windows下的2個換行,若是在Linux下,相同匹配的正則表達式可寫成:\n\n

 

(2) 匹配數字字符

示例文本

if(testArray[2] == 10) { ... }

正則表達式

testArray\[\d\]

匹配結果

if(testArray[2] == 10) { ... }

解釋:

對於數組外的方括號 「[」 和 「]」,要用轉義字符,中間的 \d 匹配單個數字字符。

 

(3) 匹配ASCII字符的十六進制值

示例文本

ABCDEABC

正則表達式

\x41

匹配結果

ABCDEABC

解釋:

\xn中的n表示ASCII字符的十六進制值,例如ASCII字符 「A」 的ASCII值寫成十六進制爲0x41, 則 \x41 可匹配文本中的全部 「A」 字符。

 

 

 

3. 次數元字符用法簡單說明

 

(1) 匹配 1 次或屢次重複: +

示例文本

The 1st email is to tom@initcircuit.com.
The 2nd email is to jane@cnblogs.com.
The 3rd email is to tim.brown@initcircuit.com.cn.

正則表達式

\w+@\w+.\w+

匹配結果

The 1st email is to tom@initcircuit.com.
The 2nd email is to jane@cnblogs.com.
The 3rd email is to tim.brown@initcircuit.com.cn.

解釋:

\w+ 能夠有效匹配一個或多個字母數字下劃線,因此能匹配出前兩個email地址。 但在第3個匹配時有點問題,因爲 \w 不包括「.」號,因此第3個email地址的@前面和@後面都只匹配了一部分,解決方案見下條目。

 

(2) 匹配 0 次或屢次重複: *

示例文本

The 1st email is to tom@initcircuit.com.
The 2nd email is to jane@cnblogs.com.
The 3rd email is to tim.brown@initcircuit.com.cn.

正則表達式

\w+[\w\.]*@[\w\.]+\.\w+

匹配結果

The 1st email is to tom@initcircuit.com.
The 2nd email is to jane@cnblogs.com.
The 3rd email is to tim.brown@initcircuit.com.cn.

解釋:

能夠把上面的正則表達式拆成5部分分別來看:\w+   [\w\.]*    @    [\w\.]+   \.\w+

第1部分的 \w+ 表示必須以字母或數字開頭,不能有「.」開頭,這部分匹配上面的:tom, jane, tim。

第2部分的 [\w\.]* 表示能夠有0個或多個的「字母數字」或「.」號,這部分匹配上面的:.brown。

第3部分的 @ 直接匹配文中的 @。先跳過第4部分,直接看第5部分。

第5部分的 \.\w+ 表示先匹配一個「.」號,後面再跟1個或多個的字母數字,這部分匹配上面的:.com, .com, .cn。

最後看第4部分的 [\w\.]+,表示可匹配一個或多個的字母數字或「.」號,這部分匹配上面的:initcircuit, cnblogs, initcircuit.com。

 

(3) 匹配 0 次或 1 次 重複: ?

示例文本

The URL is http://www.initcircuit.com/, and  https://www.initcircuit.com/.

正則表達式

https?://[\w\./]+/

匹配結果

The URL is http://www.initcircuit.com/, and  https://www.initcircuit.com/.

解釋:

正則表達式中的 s? 可匹配 s 的 0 次或 1 次出現。

 

(4) 匹配重複的次數: {n}

示例文本

background-color="#A2A2A2"; color="#000000"

正則表達式

#[0-9A-Fa-f]{6}

匹配結果

background-color="#A2A2A2"; color="#000000"

解釋:

匹配一個十六進制位的6次重複。

 

(5) 匹配至少重複的次數: {n,}

示例文本

001: 123.01
002: 52.48
003: 1024.56

正則表達式

\d+: \d{3,}\.\d{2}

匹配結果

001: 123.01
002: 52.48
003: 1024.56

解釋:

中間的 \d{3,}\. 匹配:點號前至少有3位數字, 這樣就把大於100數字給匹配出來了。

 

(6) 匹配重複次數的區間: {n,m}

示例文本

2018-01-01
99/12/01
3-3-3
03-03-03

正則表達式

\d{2,4}[\-/]\d{1,2}[\-/]\d{1,2}

匹配結果

2018-01-01
99/12/01
3-3-3
03-03-03

解釋:

本例用於匹配合法的日期,最前面的\d{2,4}用於匹配年份, 用2位數或4位數表示年份均可以,中間的 [\-/] 表示日期分隔符,「-」或「/」均可以匹配(其中「-」前用了轉義符), 後面的 d{1,2} 表示月份,用1位或2位均可以匹配出來。(本例只是展現 {n,m} 的用法,匹配表達式寫法並不完美, 後面有匹配日期更好的正則表達式的寫法)

 

(7) 防止過分匹配,懶惰型次數匹配符: *?,   +?,   {n,}?

示例文本

The html is <p>abc</p> and <p>def</p>.

正則表達式

<p>.*</p>

匹配結果

The html is <p>abc<p> and <p>def<p>.

解釋:

因爲正則表達式中間的.*可匹配任意字符的任意屢次重複, 所以把本行的最前面1個<p>和最後的一個</p>中間的內容都一古腦兒地全都匹配了出來, 這不是咱們想要的結果。可以使用 * 的懶惰型版本 *? 來匹配,改進以下:

正則表達式

<p>.*?</p>

匹配結果

The html is <p>abc<p> and <p>def<p>.

解釋:

懶惰型版本 *? 在匹配任意次數的重複的字符時,會時時注意其後面的表達式 </p>,若是一旦發現後面的表達式</p>符合匹配條件,本身自己就中止繼續匹配了。因此在本例中, 只匹配到</p>以前的部分。

 

 

 

4. 位置元字符用法簡單說明

 

(1) 匹配單詞邊界

示例文本

There is a car on the card.

正則表達式

car

匹配結果

There is a car on the card.

解釋:

咱們只想匹配 car,不想匹配後面的 card, 此時須要使用單詞邊界匹配 \b,改進以下:

正則表達式

\bcar\b

匹配結果

There is a car on the card.

解釋:

單詞邊界匹配符 \b 判斷單詞邊界的依據是: 它的左右兩邊分別是一個 \w 和 一個 \W。注意:位置元字符 \b 僅匹配位置,其自己並不匹配任何實際出現的字符。 在本例中,car 單詞的開頭處,其左邊是一個空格(即\W),右邊是一個字母 c(即\w),符合 \b 的邊界判斷條件。car 單詞的結尾也相似,car 單詞結尾處,其左邊是一個字母 r(即\w),右邊是一個空格(即\W),亦符合 \b 的邊界判斷條件, 故2個 \b 的中間不分的 car 被匹配出來。

 

(2) 匹配字符串開頭與結尾

示例文本

something
<html>
    blablabla
</html>
something else

正則表達式

<html>.*</html>

匹配結果

something
<html>
    blablabla
</html>
something else

解釋:

若是咱們但願,整段文本只有當以<html>開頭時才匹配, 若以前有其餘內容則不匹配;一樣,整段文本只有以</html>結尾時才匹配,以後如有其餘內容則不匹配, 此時就須要用到 ^(字符串開頭)和 $(字符串結尾)匹配符了。改進以下:

正則表達式

^<html>.*</html>$

匹配結果

something
<html>
    blablabla
</html>
something else

解釋:

這樣,上面的示例文本就不會有內容被匹配出來了。

 

 

 

5. 子表達式與回溯用法簡單說明

 

(1) 子表達式

說明:

前面的「次數元字符」只能匹配1個字符的若干次重複, 若是咱們要匹配一個字符串的若干次重複,就須要用到子表達式。

示例文本

The abcabc can match, but not the abc.

正則表達式

(abc){2}

匹配結果

The abcabc can match, but not the abc.

解釋:

子表達式(abc)重複2次能夠被匹配出來。

 

(2) 匹配IP地址

示例文本

The IP address is 192.168.1.10.

正則表達式

(\d{1,3}\.){3}\d{1,3}

匹配結果

The IP address is 192.168.1.10.

解釋:

子表達式爲(\d{1,3}\.),表示1~3位數字後跟一個「.」號, 能夠匹配形如:「192.」或「1.」這樣的字符模式。以後的 {3} 表示重複3次,便可以把「192.168.1.」匹配出來了。 最後的 \d{1,3} 表示1~3位數字,能夠把最後的「.10」匹配出來。固然,這個正則表達式並不完美, 會把超過255的不合理的IP地址也匹配出來,後面的「經常使用正則表達式示例」會有更好的解決方案。

 

(3) 邏輯或的使用

示例文本

1111, 1920, 5279, 2099, 199

正則表達式

(19|20)\d{2}

匹配結果

1111, 1920, 5279, 2099, 199

解釋:

這裏只匹配以19或20開始的年份,子表達式中使用了「|」號, 匹配19或20,後面的 \d{2} 表示後面再跟2位數字。

 

(4) 子表達式的嵌套

說明:

這裏咱們用子表達式的嵌套來解決前面的IP地址的合理性問題。 咱們要找到255及如下的數字,有4種合理狀況:(1) 1位或2位數字;(2) 以1開頭的3位數字; (3) 以2開頭的3位數字,十位爲0~4的;(4) 以25開頭的3位數字,個位爲0~5的。

示例文本

192. 255. 10. 999. 

正則表達式

\b((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.

匹配結果

192. 255. 10. 999.

解釋:

這個嵌套的正則表達式看上去很複雜,其實拆開來看仍是比較簡單的:

\b( (\d{1,2}) | (1\d{1,2}) | (2[0-4]\d) | (25[0-5]) )\.

其中,4個黑色文字的子表達式分別表示前述4種狀況的匹配, 它們之間用邏輯或並列嵌入到外層的一個子表達式中(紅色括號),最前面的 \b 匹配單詞邊界, 最後的 \. 匹配點號。

 

(5) 回溯引用

說明:

有時咱們想匹配文本中連續出現的2個重複單詞,而無論單詞內容是什麼, 這種需求只能用子表達式的回溯引用來實現。在回溯引用時,若正則表達式中有若干個子表達式, 則 \1 表示從左數起第1個子表達式,\2 表示第2個子表達式,依此類推。 在許多實現裏,\0 可用來表明整個正則表達式。

示例文本

There is a white white cat.
The color of of the dog yellow.

正則表達式

\b(\w+)\b[ ]+\1

匹配結果

There is a white white cat.
The color of of the dog yellow.

解釋:

正則表達式中,\b(\w+)\b 表示匹配1個單詞, [ ]+ 表示匹配其後的1個或多個空格,最後的 \1 就是回溯引用前面的子表達式 (\w+) 中匹配的內容, 若 (\w+) 匹配到 white,則 \1 也去匹配 white;若 (\w+) 匹配到 of,則 \1 也去匹配 of。

 

(6) 利用回溯匹配html配對標籤

示例文本

<h1>This line is right.</h1>
<h2>This line is also right.</h2>
<h1>Wrong!!!</h2>

正則表達式

<h([1-6])>.*?</h\1>

匹配結果

<h1>This line is right.</h1>
<h2>This line is also right.</h2>
<h1>Wrong!!!</h2>

解釋:

對於<h>標籤,其中數字只能配對出現, 故使用回溯子表達式,\1 表示前面子表達式 ([1-6]) 已匹配到的數字。另外,注意這裏使用了 *? 懶惰型次數匹配符。

 

(7) 條件回溯

說明:

有時咱們有這種需求,好比在 html 文件中, 咱們想要匹配全部被<span>...</span>包裹的標籤。但若是這個<span>被包裹在 <p>...</p>中,則把外層的<p>和</p>標籤中的內容也一塊兒匹配出來。

示例文本

<body>
<span>something</span>
<p><span>anything</span></p>
<p class="abc"><span>everything</span></p>
</body>

正則表達式

(<p\s*[^>]*>\s*)?<span>.*?</span>(?(1)\s*</p>)

匹配結果

<body>
<span>something</span>
<p><span>anything</span></p>
<p class="abc"><span>everything</span></p>
</body>

解釋:

這個正則表達式比較長,須要拆解開來分析:

(<p\s*[^>]*>\s*)? <span>.*?</span> (?(1)\s*</p>)

先看黑體顯示的第1個子表達式,這能夠匹配: <p>或<p class="abc">,其後的 ? 表示 0 次或 1 次匹配,即<p>標籤能夠出現1次,也能夠沒有。

其後的 <span>.*?</span> 部分比較簡單, 可匹配<span>標籤對及其中的文字內容,注意這裏用了懶惰型元字符 *? 匹配 0 個或多個字符。

最後是紅色括號中的條件回溯,紅字表示,若第1個子表達式有匹配, 則執行匹配後面的 \s*</p>部分,若第1個子表達式沒有出現匹配,則後面的 \s*</p>也不做匹配。

 

 

 

6. 先後查找元字符用法簡單說明

 

(1) 向前查找(lookahead)

說明:

有時咱們想匹配某種模式以前的內容, 但又不想把這個模式自己給匹配出來,這時可用到前向查找。以下例中,咱們想匹配冒號前的字符, 但又不想把冒號自己給匹配出來。

示例文本

http://www.initcircuit.com/
https://www.initcircuit.com/

正則表達式

.+(?=:)

匹配結果

http://www.initcircuit.com/
https://www.initcircuit.com/

解釋:

正則表達式中,.+ 表示匹配1個或多個任意字符,(?=:)爲匹配冒號, 但匹配結果僅爲冒號前的字符(不包含冒號),這就是「向前查找」的含義。

 

(2) 術語:消費(consume)

說明:

有些正則表達式文檔會使用「消費」(consume)這一術語, 表示「匹配且返回文本」的含義。在上面的向前查找(lookahead)中的例子中,冒號被匹配但不在返回文本中, 故稱爲:不消費。

 

(3) 向後查找(lookbehind)

示例文本

Tom: 80
Jane: 95
Jack: 100

正則表達式

(?<=:\s*)\d+

匹配結果

Tom: 80
Jane: 95
Jack: 100

解釋:

本例中,須要匹配冒號後的數字,因此用到了向後查找 (?<=) 元操做符,因爲冒號後還有若干個空格, 故用 \s* 予以匹配,但冒號和空格都不出如今匹配結果中, 只出現後面 \d+ 匹配的數字

 

(4) 取反先後查找(negtive lookahead/lookbehind)

說明:

在下面的例子中,要匹配a開頭的數字(但只取出數字)很容易, 只要使用普通的「向後查找」就能夠了。可是若是要匹配那些不以a開頭的純數字(以下例中的80和95), 就須要用到「取反先後查找」了。

示例文本

Tom's cardnum is a01. His score is 80. Jane's cardnum is a02. Her score is 95.

正則表達式

\b(?<!a)\d+\b

匹配結果

Tom's cardnum is a01. His score is 80. Jane's cardnum is a02. Her score is 95.

解釋:

這裏的 (?<!a) 就是取反向後查找, 把不是以 a 開頭的數字給匹配出來。注意先後使用的 \b 單詞邊界,若是不用 \b 會把文中的 1 和 2 也匹配出來。

 

 

 

8. Python 中使用正則表達式的方法及示例

 

(1) 概述

Python使用正則表達式須要導入 re 模塊,能夠直接調用 re的成員函數於對字符串進行正則表達式匹配,也能夠經過把正則表達式先編譯成一個「正則表達式對象」, 而後使用這個對象進行操做和匹配。這裏僅介紹第一種方法。

 

(2) re 的部分經常使用函數

findall(pattern, string [,flags]) 在 string 中匹配 pattern,匹配結果用一列表返回
finditer(pattern, string [,flags]) 同上,但返回一個迭代器
split(pattern, string [,maxsplit = 0]) 根據 pattern 出現的位置拆分 string,返回字符串列表,參數 maxsplit 爲最大拆分次數,默認所有拆分。
sub(pattern, repl, string [,count = 0]) 使用 repl 替換 string 中出現的 pattern,返回替換後的新字符串。參數 count 爲最大替換次數,默認所有替換。
subn(pattern, repl, string [,count = 0]) 同上,但返回一個元組,其中包含新字符串和替換次數
compile(str [,flags]) 編譯正則表達式對象,這裏暫不介紹

 

(3) 示例一(將日期匹配出來)

python代碼

import re
text = 'The test date is from 2018/1/1 – 2018/12/31'
patt = '(\d{4})/(\d{1,2})/(\d{1,2})'
re.findall(text, patt)

執行結果

[('2018', '1', '1'), ('2018', '12', '31')]

解釋:

執行結果爲 re.findall 函數返回的匹配結果列表。 因爲正則表達式中使用了3個子表達式,故在結果中,把這3個子表達式的匹配結果分開放到了一個元組中。

 

(4) 示例二:將日期格式替換成歐洲格式(即:日/月/年)

python代碼

import re
text = 'The test date is from 2018/1/1 – 2018/12/31'
patt = '(\d{4})/(\d{1,2})/(\d{1,2})'
re.sub(patt, r'\3\2\1', text)

執行結果

The test date is from 1/1/2018 - 31/12/2018

解釋:

執行結果爲 sub.re 函數返回的結果,其中 repl 用到了正則表達式中的子表達式回溯引用表示。

9. JavaScript 中使用正則表達式的方法及示例

 

(1) 概述

在Js中,能夠經過 String 對象和 RegEx 對象實現正則表達式處理, 這裏僅介紹 String 對象的方法。注意在Js中,正則表達式首尾用兩個「/」來括起, 這樣可自動生成一個正則表達式對象,而不是雙引號或單引號(用引號的話,就是字符串對象了)。

 

(2) String 對象中關於正則表達式的函數

str.search(regexp) 在 String 對象中查找匹配入參正則表達式 regexp,匹配成功則返回在字符串中首次匹配項的索引; 不然返回 -1
str.match(regexp) 在 String 對象中查找匹配正則表達式 regexp,匹配成功則返回一個包含若干匹配信息的 Array(內容詳見下例二), 未匹配則返回 null
str.replace(regexp|substr, newSubStr) 將 String 對象內匹配到的 regexp 替換成 newSubStr,返回新字符串,原字符串不變。
str.split(regexp [,limit]) 使用regexp描述的分隔符將一個 String 對象分割成字符串數組。

 

(3) 示例一(search使用)

Js代碼

var text = 'The fox, and the dog.';  // 生成1個String對象
var regex = /[^\w\s]/;              // 匹配非字母和非空格
var idx = text.search(regex);
console.log(idx);
console.log(text[idx])

執行結果

> 7
> ","

解釋:

search 匹配到的第一個非字母和非空格是「,」, 故返回其索引值:7。

 

(4) 示例二(match使用)

Js代碼

var text = 'For more information, see Chapter 3.4.5.1';  
var regex = /see (Chapter \d+(\.\d)*)/;      // 不使用 g 標誌
var ary = text.match(regex);
console.log(ary);

執行結果

> ["see Chapter 3.4.5.1", 
"Chapter 3.4.5.1", 
".1"
index: 22,
input: 'For more information, see Chapter 3.4.5.1']

解釋:

能夠看到返回 Array 中,各個子表達式的匹配。

 

Js代碼(regexp使用 g 標誌)

var text = 'For more information, see Chapter 3.4.5.1';  
var regex = /see (Chapter \d+(\.\d)*)/g;      // 使用 g 標誌
var ary = text.match(regex);
console.log(ary);

執行結果

> ["see Chapter 3.4.5.1"]

解釋:

使用 g 標誌後,僅將總體匹配結果放入返回 Array 中。

 

(5) 示例三(replace使用)

Js代碼

var text = 'The fox, and the dog.';   
var regex = /dog/;               
var newtext = text.replace(regex, 'cat');
console.log(newtext);

執行結果

> The fox, and the cat.

解釋:

replace 匹配到 dog 後,用 cat 替換。 新字符串經過返回值返回,原字符串不變。

相關文章
相關標籤/搜索