《正規表示式必知必會》學習筆記以及示例文件

alberthao發表於2020-04-18

前言

最近又把正則拿出來看。這本書還是要經常複習一下的。書裡有很多示例,講解的也很透徹,動手跟著複習一遍收穫很多。
實驗工具你可以到這裡下載,免費版,匹配次數也沒有限制: http://www.regexlab.com/zh/mtracer/ 還有一個選擇是sublime text,免費版即可,搜尋時,開啟搜尋框裡面的正則按鈕即可(一個.*類似的圖示)。

另外,再提供個視覺化工具,用圖形來幫助你理解正則的邏輯: https://jex.im/regulex/#!flags=&re=%5E(a%7Cb)*%3F%24

1 正則的用途

正規表示式簡稱正則。我們可以用它來匹配字串。搜尋字串,例如搜尋car,Car,CAR。 當然也可以用來做替換。例如將http://www.ituring.com.cn 替換為<a href="http://www.ituring.com.cn" >圖靈科技</a>

2 匹配單個字元

我們用英文的句點來匹配單個字元。 請您來想一想:.a.能夠匹配到什麼?如果我們要匹配最後三行,應該怎麼寫正規表示式呢?

示例2-1:

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
.a.\.xls試試能匹配到什麼?\.指什麼,你知道嗎?

3 匹配一組字元

請問如果要在下面文字中,我只想匹配n和s開頭的文字,該如何做?

示例3-1:

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
[ns]a.\.xls怎麼樣呢?

我們再加一組例子,你再看看[ns]a.\.xls匹配的對不對。

示例3-2:

sales1.xls  
orders3.xls  
sales2.xls  
sales3.xls  
apac1.xls  
europe2.xls  
na1.xls  
na2.xls  
sa1.xls  
ca1.xls  
usa1.xls  

再試試[ns]a[0-9]\.xls呢?
enter image description here
小練習,你來試一下,要匹配下面的十六進位制顏色程式碼,該怎麼寫呢?

示例3-3:

body {
background-color: #fefbd8; }
h1 {
background-color: #0000ff;}
div {
background-color: #d0f4e6;}
span {
background-color: #f08970;}

取反^的示例,下面資料中,如何取出sam.xls:

示例3-4:

orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls

4 元字元

元字元包括- \[]。當然還有很多。先介紹這些。

示例4-1:

<body>  
<h1>Welcome to my Homepage</h1>  
Content is divided into two sections:<br/>  
<h2>SQL</h2>  
Information about SQL.  
<h2>RegEx</h2>  
Information about Regular Expressions.  
<h2>This is not valid HTML</h3>  
</body>  `

enter image description here
看看圖片裡面和你做法一樣嗎?

5 重複匹配

5.1 *?+來匹配

這一節也學了很多次,用的時候還是混淆。今天編個口訣記一下。零星(重複次數大於等於0次的用*),一加手機(重複次數≥1的用加號),自問(獨自一個人的用問號)。
怎麼樣,你記住了嗎。

看看如何匹配下列電子郵件地址,一邊做一邊想一想:

示例5-1 匹配郵件

Send personal email to ben@forta.com. For questions about a book use support@forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if it were that simple, huh?).

\w+@\w+\.\w+可以嗎?

示例5-2 匹配郵件

y@ituring.com.cn
yf@itruing.com.cn
yangf@ituring.com.cn

\w+@\w+\.\w+還可以嗎?該怎麼改進?

示例5-3 匹配郵件地址

Send personal email to ben@forta.com or ben.forta@forta.com. For questions about a book use support@forta.com. If your message is urgent try ben@urgent.forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if it were that simple, huh?).
[\w.]+@[\w.]+\.\w+可以嗎?

示例5-4 匹配網址

The URL is http://www.forta.com/, to connect
securely use https://www.forta.com/ instead.
https?:\/\/[\w.\/]+ 可以嗎?

示例5-5 匹配回車換行符

"101","Ben","Forta"
"102","Jim","James"

"103","Roberta","Robertson"
"104","Bob","Bobson"

5.2 {n,m}來重複

* + ?可以來表示重複次數,但是它們有一個明顯的缺陷。就是無法精確表達重複次數。
正規表示式中我們用{m,n}來實現這個。花括號也是元字元。 在這個表示式裡面,你可以只有m,{m}那就是m次;也可以m和n都有,就是大於等於m,小於等於n次,也可以只有m和逗號,就是m次起步,上不封頂。

示例5-6 匹配RGB顏色的16進位制程式碼

body {
background-color: #fefbd8;
} h1 {
background-color: #0000ff;
} div {
background-color: #d0f4e6;
} span {
background-color: #f08970;
}
#[A-Fa-f0-9]{6} 或者[:xdigit:]{6} [:xdigit:]是POSIX表示的正則,可以參考這裡

示例5-7 匹配各種日期

4/8/17
10-6-2018
2/2/2
01-01-01

\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4}試一下。 請注意,這個正則並沒有驗證日期的真實性。只是匹配了格式。

示例5-8 匹配美元金額

1001: $496.80
1002: $1290.69
1003: $26.43
1004: $613.42
1005: $7.61
1006: $414.90
1007: $25.00

\$\d{3,}\.\d或者\d+: \$\d{3,}\.\d 注意美元符也是元字元。需要轉義。

5.3 防止過度匹配

你對比下*和{n,} +與?的區別。

示例5-9匹配html標記

This offer is not available to customers
living in <b>AK</b> and <b>HI</b>.

請試一下<b>.*?</b>,為什麼這裡用?問號呢,就是將貪婪模式轉換為懶惰模式。
變為?,+變為+?,{n,}變為 {n,}?就將貪婪模式變為了懶惰模式。

6邊界匹配

所謂的邊界匹配,簡單說就是將cat和scattered裡的cat區分出來的能力。它匹配的是邊界位置。

6.1單詞邊界

示例6-1

The cat scattered his food all over the room.
這個可以用\b,\b匹配的是一個位置,它位於\w能匹配到的內容(字母、數字和下劃線)和\W(不構成單詞的其他字元,也就是非字母、數字、下劃線的字元)能匹配的東西之間。

示例6-2

The captain wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.
這次試一下,如何匹配cap開頭的單詞,如何匹配cap結尾的單詞? Please enter the nine-digit id as it appears on your color - coded pass-key.

6.2 字串邊界

^$分別用來匹配

相關文章