前言 :
借一道正則表達式題, 複習正則表達式(實際也不是複習了, 以前也沒看明白, 估計是沒有使用場景)
題目:
以下哪一項正則能正確的匹配網址: http://www.bilibili.com/video/av21061574()
A: /^(https?:\/\/)?([a-zA-Z\d]+).bilibili.com\/?video\/av(\D{1,8})\/?$/
B: /^(http:\/\/)?(\w+)\.bilibili\.com\/?video\/av(\d{1,8})\/?$/
C: /^(https?:\/\/)?(\w+)\.bilibili\.com\/?\w*$/
D: /^(http:\/\/)?([a-zA-Z\d]+).bilibili.com\/?video\/av\w*\/+$/
正則表達式:
以前雖然看過正則表達式, 但是一臉蒙逼的看完了也不知道有啥用, 因此先複習知識點
正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱爲"元字符")組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式作爲一個模板,將某個字符模式與所搜索的字符串進行匹配。
正則表達式組成
正則表達式主要分爲兩種字符, 第一種是普通字符,第二種是特殊字符(也稱爲元字符)
普通字符:
普通字符包括沒有顯式指定爲元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母、所有數字、所有標點符號和一些其他符號
元字符:
1. 非打印字符
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須爲 A-Z 或 a-z 之一。否則,將 c 視爲一個原義的 'c' 字符。 |
\f | 匹配一個換頁符。等價於 \x0c 和 \cL。 |
\n | 匹配一個換行符。等價於 \x0a 和 \cJ。 |
\r | 匹配一個回車符。等價於 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。注意 Unicode 正則表達式會匹配全角空格符。 |
\S | 匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。 |
\t | 匹配一個製表符。等價於 \x09 和 \cI。 |
\v |
匹配一個垂直製表符。等價於 \x0b 和 \cK。 |
2. 特殊字符:要匹配這裏面列出來的字符,需要使用 \ 進行轉義,類似\n表示換行
$ | 匹配輸入字符串的結尾位置 |
() | 標記一個子表達式的開始和結束位置, 子表達式可以獲取供以後使用 |
* | 匹配前面的表達式0次或者多次, 如(https)*表示沒有https或者https有多次, 而https*表示s有零次或多次, 前面的http只有一次 |
+ | 前面的子表達式一次或者多次, 不能沒有,例如(https)+表示https出現一次或者多次, https+可以表示https或者httpsss等 |
. | 匹配除了換行符 \n 之外的任何單字符(只能匹配一個字符) |
[ | 標記中括號表達式的開始 |
? | 表示匹配前面的子表達式零次或者一次,例如(https)?表示https或者空字符串 |
\ | 將特殊字符進行轉義, 如將\\轉義爲\等 |
^ |
匹配字符串的開始位置, 除非在方括號表達式中使用, 此時它表示不接受該字符集合 |
{ | 表示限定符表達式的開始 |
| |
兩項之間的一個選擇 |
3. 限定符
* | 匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。 |
+ | 匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。 |
? | 匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 。? 等價於 {0,1}。 |
{n} | n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。 |
{n,} | n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。 |
{n,m} | m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。 |
4. 定位符
^ | 匹配輸入字符串開始的位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 還會與 \n 或 \r 之後的位置匹配。 |
$ | 匹配輸入字符串結尾的位置。如果設置了 RegExp 對象的 Multiline 屬性,$ 還會與 \n 或 \r 之前的位置匹配。 |
\b | 匹配一個單詞邊界,即字與空格間的位置 |
\B | 非單詞邊界匹配。 |
關於\b, \b代表單詞邊界, 也就是單詞和符號之間的邊界,
這裏的單詞可以是中文字符,英文字符,數字;符號可以是中文符號,英文符號,空格,製表符,換行
比如" 2 "通過正則表達式/\b2\b/匹配不成功,而可以匹配成功"2",也就是說空格不是邊界, 而空格和字符之間的位置纔是所謂的邊界
5. 其他常用
\s | 用於匹配單個空格符,包括tab鍵和換行符 |
\S |
用於匹配除單個空格符之外的所有字符 |
\d | 用於匹配從0到9的數字 |
\D | 用於匹配除0-9之外的所有字符 |
\w | 用於匹配字母,數字或下劃線字符 |
\W | 用於匹配所有與\w不匹配的字符 |
分析:
以下哪一項正則能正確的匹配網址: http://www.bilibili.com/video/av21061574()
A: /^(https?:\/\/)?([a-zA-Z\d]+).bilibili.com\/?video\/av(\D{1,8})\/?$/
B: /^(http:\/\/)?(\w+)\.bilibili\.com\/?video\/av(\d{1,8})\/?$/
C: /^(https?:\/\/)?(\w+)\.bilibili\.com\/?\w*$/
D: /^(http:\/\/)?([a-zA-Z\d]+).bilibili.com\/?video\/av\w*\/+$/
如果通過正則表達式匹配, 可以有多種正則表達式寫法, 此題只需要排着分析ABCD四個選項, 如果能正確匹配, 則符合題意
整體分析:
- 前後的/.../表示正則表達式的開始和結束的標誌,
- ^表示開始,$表示結束
- \/\/ 匹配 // (經過轉義)
- ?匹配0-1次
- ( [a-zA-Z\d]+ )匹配字母以及數字0-多次
- \D {1,8}匹配非數字一位至八位
- \w匹配字母數字下劃線
- \d{1,8}匹配1-8位數字
- \.匹配一個 精確的. 而.可以匹配除了換行之外的所有字符
A: 開頭https就不滿足,因爲是精確匹配https一至八位, 最後的數字也不滿足\
B: 滿足
C: 開頭https不滿足, 並且\w*可以匹配數字字母下劃線多次, 但是匹配不到video後面的 /
D: 前面都滿足,但是最後有一個\/+表示至少匹配一個 / , 原題沒有