我們在web開發中,經常會用到正則來驗證用戶所輸入和提交的內容,所以站長也會經常收集和整理一些好用的正則表達式,記錄和整理本來就是學習過程中的一部分,今天在網上看到有人在詢問一個正則,就自己寫了一下,拿出來與大家分享。
一:要求用正則來驗證用戶輸入的密碼,至少包含大小字字母,數字和特殊符號中兩種,簡單的說,就是驗證用戶輸入的密碼不能太簡單。
乍一想,這種正則好像不太方便下手寫,至少以前站長在驗證用戶輸入的密碼格式時,都是分步來寫的,比如:
if(/[a-z]/g.test(v)){
alert("不能純為小寫字母");
return false;
}else if(/[A-Z]/g.test(v)){
alert("不能純為大寫字母");
return false;
}else if(/[0-9]/g.test(v)){
alert("不能純為數字");
return false;
}else if(/[^0-9a-zA-Z]/g.test(v)){
alert("不能純為非字母和數字的特殊符號");
return false;
}
現在技術比以前好了那么“一丟丟”,就在想,能不能用一句正則來實現呢?當然是可以的,下面是具體的正則:
var v=$("#text").val();
reg=/^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$).{6,}$/;
alert(reg.test(v));
上面的正則表達的意思是,不能為純數字,不能為純小寫字母,不能為純大寫字母,不能為純特殊符號,至少六位。
不要看着有點復雜,其實很簡單的,站長來給大家拆開分析一下:
(?!) 這是正則里的一個“語法結構”,表示“規定后面不是”的意思,看這篇《jquery正則中問號的三種[說四種那是忽悠人]用法詳解及在線實例演示》
了解了上面這一句,那么上面的正則就好理解了:
(?![0-9]+$) 表示后面不能為純數字
(?![a-z]+$) 表示后面不能為純小寫字母
(?![A-Z]+$) 表示后面不能為純大寫字母
(?!([^(0-9a-zA-Z)])+$) 表示后面不能為除數字和字母外的純特殊符號
^ 這個符號單獨用表示“開頭”,用在中括號的開頭,表示“非”;
.{6,} 表示至少6位的任意字符
$ 表示“結尾”
二:另外還有一種情況,那就是,有時我們需要我們的密碼必須為“字母+數字+特殊符號”,那么我們要如何寫呢?
(?![0-9a-z]+$) 不能為小寫字母與數字
(?![0-9A-Z]+$) 不能為大寫字母與數字
(?![0-9\W]+$) 不能為數字及特殊符號
(?![a-z\W]+$) 不能為小寫字母及特殊符號
(?![A-Z\W]+$) 不能為大寫字母及特殊符號
(?![0-9a-zA-Z]+$) 不能為大寫,小寫字母與數字
把這三種情況也加上去后,就只剩下“必須包含數字、大小寫字母和特殊符號”這一種情況了,但是我們也得出了一個超長的正則,這里就不寫了!
那么有沒有簡單的方法呢?當然是有的:
var v=$("#text").val();
reg=/^(?=.*[a-zA-Z])(?=.*[1-9])(?=.*[\W]).{6,}$/;
alert(reg.test(v));
(?=)這個語法結構在正則里表示“設定后面是”的意思。
(?=.*[a-zA-Z]) 這句的意思就是后面必須有一位大寫或小寫字母
(?=.*[1-9]) 這句的意思是后面必須有一位數字
(?=.*[\W]) 這句的意思是后面必須有一個非字母數字及下划線的特殊符號
上述正則校驗在實際使用中會遇到很多全角符號導致驗證失敗的問題,所以最后我們在項目中改成了限定特殊符號的范圍。因為我們想着密碼的特殊符號是為了防破解,所以一些常用的特殊符號就足夠我們使用了,我們最后限定的特殊符號范圍是 !@#$%^&* 這些。於是正則表達些的寫法如下
var v=$("#text").val();
reg=/^(?=.*[a-zA-Z])(?=.*[1-9])(?=.*[!|@|#|$|%|^|&|*]).{6,}$/;
alert(reg.test(v));
上述結構中最后的 (?=.*[!|@|#|$|%|^|&|*]) 表示必須有一個!@#$%^&*中的一個,豎線在正則中表示多個中選一個。這樣限定了范圍,可以避免了很多其他全角、html預定字符等轉義導致的一些列問題。