閱讀建議,文章需要的閱讀時間大概不到10分鐘,但是紙上得來終覺淺,欲知此事須躬行,所以要真正入門需要做練習,練習大概需要20分鐘,通過閱讀和練習你就可以達到入門水平,能解決一些基礎的正則問題。在這裏推薦兩個網站供你測試和練習: 1. 正則表達式練習平臺:https://codejiaonang.com/ 2. 正則在線測試工具: http://regexr-cn.com/
入門內容目錄
字符組
正則表達式強大的地方在於它可以迅速地用極簡單的方式達到字符串的複雜控制。
字符組([]
)允許匹配一組可能出現的字符。
例如:
可以發現[Pp]
既可以匹配大寫的P
也可以匹配小寫的p
練習1
接下來,請你使用字符組匹配Java
和 java
。
入門課程的習題可以挑戰到 編程膠囊網站
練習2
請你使用字符組匹配 Ruby
、Rube
、ruby
、rube
。
做題可以挑戰至 編程膠囊
區間
有一些常見的字符組非常大,比如,我們要匹配任意的數字,如果依照上述代碼,每次我們都需要使用[0123456789]
。
但是這樣好嗎?
如果要匹配從a-z
的字母呢?我想你肯定不願意從a
寫到z
了!
爲了適應這一點,正則表達式引擎在字符組中使用連字符(-)
代表區間,依照這個規則,我們可以總結出三點:
- 要匹配任意數字可以使用
[0-9]
; - 如果想要匹配所有小寫字母,可以寫成
[a-z]
; - 想要匹配所有大寫字母可以寫成
[A-Z]
。
例如:
練習——匹配目標數據
接下來需要你匹配數據所有的數字、小寫字母和大寫字母。
練習題傳送門:https://codejiaonang.com/#/course/regex_chapter1/0/1
轉義符
正則表達使用了 -
號代表了區間,但是我們有時候需要匹配的符號就是 -
號,該怎麼辦呢?
這個時候我們需要對-
號進行轉義操作,即 \-
。
在正則中使用 \
就可以進行對特殊符號進行轉義,對 -
進行轉義就可以表示爲 \-
,即 \-
就代表了 -
號本身。
偷偷告訴你,轉義符
\
也適用於其他的符號,例如匹配圓括號可以使用\(
例如:
匹配特殊符號
接下來請你編寫正則表達式匹配下列符號,可以直接跳轉至題目:https://codejiaonang.com/#/course/regex_chapter1/0/4
。
<-
[]
-----
--
()
取反
到目前爲止,我們定義的字符組都是由可能出現的字符定義,不過有時候我們可能希望根據不會出現的字符定義字符組。
例如:匹配不包含數字的字符組
可以通過在字符數組開頭使用 ^
字符實現取反操作,從而可以反轉一個字符組(意味着會匹配任何指定字符之外的所有字符)。
再看一個例子:
這裏的 n[^e]
的意思就是n
後面的字母不能爲 e
。
接下來請你匹配愛
後面不包含你
的數據。練習題鏈接:https://codejiaonang.com/#/course/regex_chapter1/0/7
愛嗎
愛哦
愛我自己
愛了
我愛我
請編寫正則表達式,匹配不包含小寫字母的數據,題目鏈接:https://codejiaonang.com/#/course/regex_chapter1/0/8
快捷方式
以目前學到的內容,如果想要匹配所有的字母,會使用[A-Za-z]
,要匹配數字會使用[0-9]
還有沒有更簡潔的方式呢?
正則表達式引擎提供了一些快捷方式如:\w
可以與任意單詞字符匹配。
當我們想要匹配任意數字的時候也可以使用快捷方式\d
,d
即digit
數字的意思,等價於[0-9]
。
快捷方式 | 描述 |
---|---|
\w | 與任意單詞匹配 |
\d | 與任意數字匹配 |
匹配單詞
接下來,請你使用快捷方式匹配下面的單詞。
master
code
jiaonang
123456789
987654321
0123
CODE
JIAONANG
hello world
python
匹配空白
\s
快捷方式可以匹配空白字符,比如空格,tab、換行等。
例如:
單詞邊界
\b
匹配的是單詞的邊界,例如,
\bmaster\b
就僅匹配有邊界的master
單詞。
當然其他類型的數據,比如數字也能匹配:
快捷方式取反
快捷方式也可以取反,例如對於\w
的取反爲\W
,將小寫改寫成大寫即可,其他快捷方式也遵循這個規則。
示例:
請使用正則表達式匹配下列開頭不以字母開頭的單詞。
開始和結束
正則表達式中 ^
指定的是一個字符串的開始,$
指定的是一個字符串的結束。
例如:
指定字符串的結束:
請編寫正則表達式匹配以OS
結尾的字符串。
任意字符
.
字符代表匹配任何單個字符,它只能出現在方括號以外。
值得注意的是: .
字符只有一個不能匹配的字符,也就是換行符(\n
),不過要讓.
字符與換行符匹配也是可以的,以後會討論。
示例:
匹配任意字母之後是ar
的字符串。
可選字符
有時,我們可能想要匹配一個單詞的不同寫法,比如color
和colour
,或者honor
與honour
。
這個時候我們可以使用 ?
符號指定一個字符、字符組或其他基本單元可選,這意味着正則表達式引擎將會期望該字符出現零次或一次。
例如:
在這裏 u?
表示u
是可選的,即可以出現也可以不出現,可以匹配的是 honor
和 honour
。
通過這個案例可以知道?
的作用就是匹配它之前的字符0
次或1
次。
請你思考一個問題:
.?
表達式能匹配什麼呢?
請你使用正則來匹配 favorite
和favourite
這兩種寫法。
重複
到目前爲止,我們只是學習了關於僅出現一次的字符串匹配,在實際開發中,肯定不能滿足需求,比如要匹配電話號碼、身份證的時候就無法滿足需求了。
如果遇到這樣的情況,我們可能期望一個字符組連續匹配好幾次。
在一個字符組後加上{N}
就可以表示在它之前的字符組出現N
次。
例如:
重複區間
可能有時候,我們不知道具體要匹配字符組要重複的次數,比如身份證有15
位也有18
位的。
這裏重複區間就可以出場了,語法:{M,N}
,M
是下界而N
是上界。
舉個例子:
\d{3,4}
既可以匹配3
個數字也可以匹配4
個數字,不過當有4
個數字的時候,優先匹配的是4
個數字,這是因爲正則表達式默認是貪婪模式,即儘可能的匹配更多字符,而要使用非貪婪模式,我們要在表達式後面加上 ?
號。
開閉區間
有時候我們可能遇到字符組的重複次數沒有邊界,例如:
閉區間不寫即可表示匹配一個或無數個。
速寫
還可以使用兩個速寫字符指定常見的重複情況,可以使用 +
匹配1
個到無數個,使用 *
代表0
個到無數個。
即:+
等價於{1,}
,*
等價於{0,}
。
+
號示例:
*
號示例:
匹配電話號碼
現在請你使用正則表達式匹配手機號碼,假設手機號碼規則如下:
- 必須是
11
位的數字; - 第一位數字必須以
1
開頭,第二位數字可以是[3,4,5,7,8]
中的任意一個,後面9
個數是[0-9]
中的任意一個數字。
18111234589
18711001111
13713201111
13712345678
14712345897
15721565489
17721565489
29711001111
30711001111
41711001111
58-1110011110
68711001111
12345678911
200110023057123
另外一些習題可以訪問 :https://codejiaonang.com/
進階課程請看下一篇:《正則表達式進階》
覺得有收穫歡迎點贊評論。