用這個(gè)正則校驗(yàn)密碼崩哩,真的可以嗎?

問(wèn)題背景

最近幫同事解決了一個(gè)正則問(wèn)題言沐,挺有意思邓嘹,分享給大家

背景是同事在做一個(gè)用戶注冊(cè)相關(guān)的功能,甲方提出了一些對(duì)密碼復(fù)雜度的要求险胰,要求長(zhǎng)度8-32位汹押,小寫(xiě)字母,大寫(xiě)字母起便,數(shù)字棚贾,符號(hào)四種必須都有,下面是匹配密碼的最初的正則表達(dá)式

(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,32}

問(wèn)題驗(yàn)證

大家可以看一下這個(gè)正則榆综,感覺(jué)一下用這個(gè)正則能夠滿足上面的密碼校驗(yàn)要求嗎妙痹?可以花一點(diǎn)時(shí)間想一想

答案是:不能

我們來(lái)做個(gè)簡(jiǎn)單的測(cè)試,建議找一個(gè)在線工具鼻疮,實(shí)際測(cè)試一下

把表達(dá)式輸入進(jìn)去怯伊,我們測(cè)如下幾段文本

  • abc123A:沒(méi)有匹配,長(zhǎng)度不夠
  • abcd12345:沒(méi)有匹配陋守,復(fù)雜度不夠震贵,沒(méi)有大寫(xiě)和符號(hào)
  • abcdA123-:能夠正常匹配利赋,長(zhǎng)度符合,復(fù)雜度符合

那這不是說(shuō)明這個(gè)正則是OK的嗎猩系?我們?cè)贉y(cè)下面這個(gè)文本

  • abcdA123-我:這怎么也匹配了
  • abc他dA★123:這怎么也匹配了

問(wèn)題改進(jìn)

這個(gè)正則里面有兩個(gè)小問(wèn)題

  • 符號(hào)限定過(guò)于寬泛:(?=.*[^a-zA-Z0-9])這個(gè)判非就把其他所有字符都囊括進(jìn)來(lái)了
  • 沒(méi)有輸入文本的限定:.{8,32}這個(gè)點(diǎn)也囊括了除換行以外的所有字符

針對(duì)上面兩個(gè)問(wèn)題改進(jìn)一下這個(gè)正則媚送,首先要枚舉我們?cè)试S出現(xiàn)的符號(hào),假設(shè)我們只允許出現(xiàn) “-_” 這兩個(gè)字符

改進(jìn)后的正則如下

^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[-_])[0-9a-zA-Z-_]{8,32}$

這個(gè)問(wèn)題一方面是缺乏測(cè)試驗(yàn)證寇甸,但更深層的原因其實(shí)是對(duì)正則不夠了解塘偎,不能快速發(fā)現(xiàn)正則的問(wèn)題,下一節(jié)我們就來(lái)看看這個(gè)正則里面比較困難的部分

擴(kuò)展閱讀

可能有同學(xué)有疑問(wèn)前面這么一大堆括號(hào)是干什么的

這里復(fù)習(xí)一下正則表達(dá)式的一個(gè)基礎(chǔ)概念:零寬斷言

零寬斷言是一種零寬度的匹配,它匹配到的內(nèi)容不會(huì)保存到匹配結(jié)果中去,最終匹配結(jié)果只是一個(gè)位置而已拿霉。

(?=)就是一種零寬斷言吟秩,叫做正向先行斷言,主要作用是匹配表達(dá)式后面的內(nèi)容

比如:\d(?=px)绽淘,這個(gè)正則能匹配到1px中的1涵防,不會(huì)匹配到2pm中的2,因?yàn)?后面跟的不是px沪铭,如果想同時(shí)把px也匹配上壮池,那就得寫(xiě)\d(?=px)px,這看起來(lái)就跟\dpx一樣了杀怠,在匹配單個(gè)條件的時(shí)候的確沒(méi)有區(qū)別椰憋,但匹配多條件的時(shí)候就不一樣了

我們還是用例子來(lái)解釋一下

[a-z0-9]{4,10}

這樣一個(gè)正則能表示英文小寫(xiě)和數(shù)字出現(xiàn)4-10次,但不能要求必須同時(shí)有英文和數(shù)字赔退,可以是純英文橙依,也可以是純數(shù)字

正則是一種順序性的描述性語(yǔ)言,1a和a1是不同的硕旗,如果想描述這種不確定位置的組合窗骑,對(duì)于普通正則寫(xiě)法來(lái)說(shuō)是比較困難的,基本就變成了排列組合了

這時(shí)我們就可以通過(guò)正向先行斷言來(lái)幫助進(jìn)行匹配卵渴,正向先行斷言可以理解成對(duì)字符串的模式匹配

(?=.*[a-z])
表示后面必須出現(xiàn)一個(gè)英文小寫(xiě)慧域,但是位置可以不定,使用.*來(lái)表達(dá)位置不定這個(gè)信息
同理
(?=.*[0-9])
表示后面必須出現(xiàn)一個(gè)數(shù)字浪读,但是位置可以不定

[a-z0-9]{4,10}限定輸入內(nèi)容和長(zhǎng)度

(?=.*[a-z])(?=.*[0-9])[a-z0-9]{4,10}
連接在一起就能表示英文小寫(xiě)和數(shù)字出現(xiàn)4-10次昔榴,且英文和數(shù)字都必須至少出現(xiàn)一次
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碘橘,隨后出現(xiàn)的幾起案子互订,更是在濱河造成了極大的恐慌,老刑警劉巖痘拆,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仰禽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吐葵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門规揪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人温峭,你說(shuō)我怎么就攤上這事猛铅。” “怎么了凤藏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵奸忽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我揖庄,道長(zhǎng)栗菜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任蹄梢,我火速辦了婚禮疙筹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘检号。我一直安慰自己腌歉,他們只是感情好蛙酪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布齐苛。 她就那樣靜靜地躺著,像睡著了一般桂塞。 火紅的嫁衣襯著肌膚如雪凹蜂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天阁危,我揣著相機(jī)與錄音玛痊,去河邊找鬼。 笑死狂打,一個(gè)胖子當(dāng)著我的面吹牛擂煞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趴乡,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼对省,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了晾捏?” 一聲冷哼從身側(cè)響起蒿涎,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惦辛,沒(méi)想到半個(gè)月后劳秋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年玻淑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗽冒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡补履,死狀恐怖辛慰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情干像,我是刑警寧澤帅腌,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站麻汰,受9級(jí)特大地震影響速客,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜五鲫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一溺职、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧位喂,春花似錦浪耘、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至规婆,卻和暖如春澜躺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抒蚜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工掘鄙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗡髓。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓操漠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饿这。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浊伙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容