從Regexpal開始
http://regexpal.com.s3-website-us-east-1.amazonaws.com/?_ga=1.247253956.1346968340.1458550626
匹配北美電話號碼
在Regexpal下方文本框中輸入電話號碼
707-827-7019
接下來要用正則表達式匹配這個號碼,在上方的文本框輸入號碼本身
707-827-7019
此時下方的文本框電話號碼從頭到尾都以黃色高亮顯示。
剛剛所寫的正則表達式是用字符串字面值(string literal)來匹配目標字符串的。
用字符組來匹配數字
如果想同時匹配電話號碼中所有數值或者只匹配特定的數值,怎么辦
嘗試下面的表達式
[0-9]
下方的文本框所有的數字以黃色和藍色交替高亮顯示,正則表達式[0-9]對正則表達式處理器傳遞的信息是“匹配0到9范圍內的任意數字”。
正則表達式將方括號視為特殊的元字符,因此方括號不參與匹配。[0-9]這種形式的正則表達式稱作字符組,有時也叫字符集。
可以對數字的范圍進行進一步限定。用更具體的一組數字也能得到同樣的結果。比如
[012789]
這個字符組只會匹配列出的數字,即0、1、2、7、8、9。
要匹配任意10位以連字符分隔的北美電話號碼,可以使用以下正則表達式
[0-9] [0-9] [0-9] - [0-9] [0-9] [0-9] - [0-9] [0-9] [0-9] [0-9]
但是太長了,可以用簡寫形式。
使用字符組簡寫式
\d可以像[0-9]一樣匹配任意阿拉伯數字,這種正則表達式叫做字符組簡寫式,也叫轉義字符。
可以使用以下表達式來匹配電話號碼中的任意數字:
\d\d\d-\d\d\d-\d\d\d\d
除了使用連字符本身來匹配連字符以外,也可以用轉義的大寫D(\D),它可以匹配任何一個非數字字符。
\d\d\d\D\d\d\d\D\d\d\d\d
匹配任意字符
還可以用點號匹配那些討厭的連字符。
\d\d\d.\d\d\d.\d\d\d\d
點號是一個通配符,可以匹配任意字符(但某些情況不能匹配行起始符)。
捕獲分組和向后引用
這里我們使用捕獲分組來匹配電話號碼中的某一部分。然后使用后向引用對分組中的內容進行引用。
要創建捕獲分組,先將一個\d放在一對圓括號中,這樣就將它放入了一個分組中,后面可以用\1來對捕獲的內容進行后向引用。
(\d)\d\1
\1對括號內分組捕獲的內容進行了反向引用。這個正則表達式匹配的是區號707。
- (\d)匹配第一個數字並將其捕獲(數字7)。
- \d匹配第二個數字(數字0)但沒有捕獲,因為沒有括號。
- \1對捕獲的數字進行反向引用(數字7)。
現在可以用一個分組和幾個后向引用對整個電話號碼進行匹配。
(\d)0\1\D\d\d\1\D\1\d\d\d
使用量詞
現在用另一種語法來匹配電話號碼
\d{3}-?\d{3}-?\d{4}
花括號中的數字表示待查找的數字出現的次數。包含數字的花括號是一種量詞。花括號本身用作元字符。
問號是另一種量詞,在以上表達式中表示連字符是可選的。也就是說,連字符可以不出現或只出現一次。還有其他量詞,例如加號+表示“一個或多個”,星號*表示零個或多個。
使用量詞能讓正則表達式變得更加簡潔:
(\d{3,4}[.-]?)+
加號表示出現一次或多次。這個正則表達式表示括號里的模式出現一次或多次,括號里的模式匹配三位或四位數字,后跟一個連字符或一個點號。
解釋上面表達式的每一項:
- 左圓括號(為捕獲分組的起始符
- \d匹配一位數字
- {3,4}表示匹配的數字是3位或者4位
- [.-]?匹配一個可選的點號或連字符
- 右圓括號)為捕獲分組的結束符
- 加號+表示一個或多個
改進后:
(\d{3}[.-]?){2}\d{4}
這個表達式匹配的字符串是連續兩個無括號的三位數字,每三位數字后可以帶連字符也可以不帶,最后是一個四位數字。
括選文字符
最后這個正則表達式表示第一個3位數字可以帶也可以不帶括號,即區號是可選的:
^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$
- 出現在正則表達式起始位置或者豎線之后^的脫字符,表示電話號碼會出現在一行的起始位置
- 左括號(為捕獲分組的起始符
- \(表示左括號本身
- \d匹配一位數字
- \d之后的{3}是量詞,表示匹配三位數字
- \)匹配右括號本身
- 豎線符|表示選擇,也就是從多個可選項中選擇一個,換句話說,它表示“匹配一個不帶括號的區號或一個帶括號的區號”
- 脫字符^匹配行起始位置
- \d匹配一位數字
- {3}表示匹配三位數字的量詞
- [.-]?匹配一個可選的點號或者連字符
- 右括號)為捕獲分組的結束符
- 問號?表示分組可選,即分組中的前綴可有可無
- \d匹配一位數字
- {3}表示匹配三位數字的量詞
- [.-]?匹配一個可選的點號或者連字符
- \d匹配一位數字
- {4}表示匹配四位數字的量詞
- 美元符$匹配行結束位置
小結
1.[0-9],字符組,或字符集,匹配0~9的數字
2.\d,字符集簡寫式,匹配數字;/D匹配非數字字符
3.點號.,通配符,匹配任意字符
4.(),圓括號,捕獲分組和向后引用,圓括號是一個分組,后面可以用\1來對捕獲的內容進行后向引用
5.{},花括號,量詞,表明出現的次數。其他量詞,+表示“一個或多個”,*表示零個或多個,?表示零個或一個