參考文檔:
http://blog.csdn.net/spch2008/article/details/50574059
http://www.runoob.com/java/java-regular-expressions.html
現(xiàn)有一個(gè)無(wú)敵坑的正則表達(dá)式如下:
/^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$|^(?:13\d|15\d|18\d)-?\d{5}(\d{3}|\*{3})$/
只記得正則表達(dá)式看過(guò)好幾次,但是由于使用的太少,導(dǎo)致看一次忘一次,所以這一次,通過(guò)這個(gè)對(duì)我來(lái)說(shuō)難度上天的表達(dá)式,簡(jiǎn)單的記錄一下學(xué)習(xí)過(guò)程。
這個(gè)正則表達(dá)式,本來(lái)是項(xiàng)目中用來(lái)校驗(yàn)輸入的支付寶賬號(hào)格式用的,因?yàn)橹Ц秾氋~號(hào)有兩種:手機(jī)號(hào)和郵箱。
分析正則
開(kāi)頭和結(jié)尾的 / 符號(hào)
這個(gè)符號(hào)很可能是前端從哪個(gè)js或者字符串中拷貝出來(lái),在這里應(yīng)該不帶任何意義。應(yīng)該去掉。通過(guò) | 豎線來(lái)拆分正則
原正則:
^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$|^(?:13\d|15\d|18\d)-?\d{5}(\d{3}|\*{3})$
拆分后:
^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$ //匹配郵箱
|
^(?:13\d|15\d|18\d)-?\d{5}(\d{3}|\*{3})$ //匹配手機(jī)號(hào)
- 單個(gè)擊破
3.1 郵箱的正則
^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$
^ 表示以...開(kāi)頭。 這里表示以(\w-*\.*)+開(kāi)頭。
(\w-*\.*)+ 表示一個(gè)或多個(gè)(字符串+零或多個(gè)減號(hào)+零或多個(gè)點(diǎn))
滿(mǎn)足(\w-*\.*)+的字符串有:
service-----service----xxx......
service-----service----xxx
service-----
123service-----
@ 表示郵箱的@符號(hào)
(\w-?)+ 表示一個(gè)或多個(gè)(字符串+零或一個(gè)減號(hào))
(\.\w{2,})+ 表示一個(gè)或多個(gè)(點(diǎn)+至少兩個(gè)字符)
$ 表示(在這)必須以(\.\w{2,})+結(jié)尾
3.2 手機(jī)號(hào)的正則
^(?:13\d|15\d|18\d)-?\d{5}(\d{3}|\*{3})$
^ 表示以...開(kāi)頭。 這里表示以(13或15或18+一個(gè)數(shù)字)開(kāi)頭。
(?:13\d|15\d|18\d) 表示(13或15或18+一個(gè)數(shù)字),關(guān)于?:請(qǐng)看特殊規(guī)則
-? 表示零個(gè)或一個(gè)減號(hào)(這點(diǎn),作為手機(jī)號(hào)的正則就讓人無(wú)法理解)
\d{5} 表示5個(gè)數(shù)字
(\d{3}|\*{3}) 表示3個(gè)數(shù)字或三個(gè)*(脫敏),這個(gè)脫敏規(guī)則也很奇怪
$ 表示(在這)必須以3個(gè)數(shù)字或三個(gè)*結(jié)尾
特殊規(guī)則
- ^ 和 $
^符號(hào)表示以什么開(kāi)頭,$符號(hào)表示以什么結(jié)尾
舉例:
^\d+$ 只能匹配數(shù)字開(kāi)口,數(shù)字結(jié)尾的表達(dá)式;
\d+$ 只要結(jié)尾是數(shù)字,就可以匹配;
^\d+ 只要開(kāi)頭是數(shù)字,就可以匹配;
- ?:
這與反向引用有關(guān),先簡(jiǎn)單介紹一下什么是后向引用。
一個(gè)稍復(fù)雜的正則表達(dá)式,可能由多個(gè)()組成,()中有各種簡(jiǎn)單的正則表達(dá)式,舉一個(gè)例子:
(\d+),(\w),(\d+) //表達(dá)式一: 三個(gè)可被捕獲的表達(dá)式
(?:\d+),(?:\w),(\d+) //表達(dá)式二:一個(gè)可被捕獲的表達(dá)式
如表達(dá)式一,三個(gè)括號(hào)可以理解成三個(gè)變量,用\1 \2 \3依次表示(\d+) 和 (\w) 和 (\d+)。
如果我要通過(guò)grep的正則來(lái)搜索:
grep -P "(\d+),(\w),\1," --color log.txt
通過(guò)\1可以獲取(\d+)
- 貪婪和懶惰 ?
正則表達(dá)式,默認(rèn)情況下都是“貪婪”,當(dāng)"?"緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后時(shí),匹配模式是“懶惰”。
“懶惰”模式匹配搜索到的、盡可能短的字符串,而默認(rèn)的“貪婪”模式匹配搜索到的、盡可能長(zhǎng)的字符串。舉例說(shuō)明:
| 表達(dá)式 | 含義 |
|---|---|
| *? | 重復(fù)零次或多次,但盡可能少 |
| +? | 重復(fù)一次或多次,但盡可能少 |
| ?? | 重復(fù)0次或1次,但盡可能少 |
| {n}? | 重復(fù)n次,但盡可能少 |
| {n,}? | 重復(fù)至少n次,但盡可能少 |
| {n,m}? | 重復(fù)n到m次,但盡可能少 |