我學正則表達式——組(group)和回溯引用(backreference)

靚號的選擇

人怕不動,腦怕不用。


一覺醒來,漫步到公司之後。項目經理又交來一個任務:
“公司最近打算升級號碼管理,針對VIP客戶推出靚號服務,暫定靚號爲6位,尾數AAAA的爲靚號,比如118888是靚號。”

這個任務太簡單了,不就是從0到9一直循環嘛,從000000-009999,選取後四位相同的號碼輸出。

用9個正則表達式:
\d{2}0{4}

...

\d{2}9{4}

大功告成!我興沖沖地用QQ向項目經理報告了這一成果,滿懷期待的等着他的回覆。

不料,一個發火彈在了QQ對話框上,後面跟了句“000000”這種號碼能用嗎!!

我趕緊拿000000一測,還真能匹配。
唉。

又挨訓了!好吧,換成
[1-9]\d0{4}

再發過去,又換來一聲嘆息。“還能簡單點嗎,這有10個正則啊”。

百度,百度,再百度。


正則中的組和回溯引用

在正則表達式中,每個括號括起來的部分叫做一個組,比如表達式
(\d{2})([a-z])
中,
組1爲\d{2}
組2爲[a-z]
其中,還暗含了一個組0,即整個正則表達式。

以11abcd爲例,如果我們採用上面的正則表達式,則
組1爲11
組2爲abcd

有了組的概念後,我們便可以利用這個組來做文章,比如,如果我們要找重複了兩次的數字,如11,22,可以寫這樣的表達式:

(\d)\1

它的意思是,第一個是數字,第二個數字跟第一個數字相同。正則表達式中,用了一個專門的術語來描述\1這種概念,即回溯引用。

再回到我們最初的問題,後四位號碼相同,各位猜到怎麼寫了嗎?

答案是:
[1-9]\d(\d)\1\1\1
或者:
[1-9]\d(\d)\1{3}

小結

在本文中,我們學習了()和回溯引用的用法:
  • ()用於把正則表達式分成匹配組
  • 回溯引用則使用了匹配組來進行再次匹配和過濾
注意:中文的()和英文的()是不同的,正則表達式必須用英文括號






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