Java基礎---正則表達式

前言 :

借一道正則表達式題, 複習正則表達式(實際也不是複習了, 以前也沒看明白, 估計是沒有使用場景)

題目:

以下哪一項正則能正確的匹配網址: 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: 前面都滿足,但是最後有一個\/+表示至少匹配一個 / , 原題沒有

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章