正則表達式之字符串驗證


正則表達式之字符串驗證

  在博文《正則表達式之數字驗證》中我們探討了數字的驗證,比如身份證號碼的驗證、電話號碼的驗證等等,這些都是非常有用的;然而字符串的驗證也是非常重要的。這篇博文我將和大家分享字符串的驗證方法,如英文單詞的驗證、非單詞字符串的驗證、文件名稱的驗證以及網絡常用元素的驗證等等。 由於水平有限,有些知識點可能理解的不一定准確,希望如果大家發現錯誤后可以提出,在此表示感謝。

  

第一部分:5種英文單詞驗證

1.小寫英文單詞的驗證

  • 我們可以使用[a-z]+驗證一個或多個小寫英文單詞,當然[a-z]{1,}亦是如此。但是這樣驗證的單詞可能不是完整的,如對於字符串ad“”,它將匹配其中的ad。
  • 為了解決上一個問題--即不能驗證完整的單詞,我們可以使用\b[a-z]+\b來驗證。即通過元字符\b來指定英文單詞的邊界。
  • \ba[a-z]*\b 可以驗證以小寫字母a開頭的一到多個英文字母的單詞。(注:限定符*表示0個或多個)
  • \b[a-c][a-z]*\b可以驗證以小寫字母a或b或c開頭的一個到多個英文字母的單詞。
  • \b[a-z]+(?:ing)\b 可以匹配以ing結尾的字符串
  • \b[a-z]{6} 可以驗證長度為6的小寫英文組成的字符串

     注意:倒數第二個驗證中的(?:ing), 雖然這里使用了(),即分組符號,但實際因為有?:,我們是不能進行反向引用的。 這里可以理解為我們僅需要將之看作一個整體,但是不希望被反向引用。

 

2.大寫英文單詞的驗證

  這里與小寫英文單詞的用法相同,我們只需要將上面的[a-z]替換成[A-Z]即可。

 

3.英文單詞的分隔符驗證

  在英文文本中,各個英文單詞被分隔符所分開。 分隔符即分開兩兩英文單詞的符號。這些分隔符包括英文標點符號,空白符等等。

  在分隔符中,又以英文標點符號居多,比如,(逗號) .(點號) ?(問號) :(冒號) ;(分號) '(單引號) !(感嘆號) "(雙引號) -(連接號) --(破折號) ()(小括號) [](中括號) {}(大括號)  ...(省略號) `(所有格符號,又稱反引號)。

  如下面的正則表達式將驗證這些英文標點符號分隔符:

[-,.?:;'"!`]|(-{2})|(\.{3})|(\(\))|(\[\])|({})

 

     我為什么沒有把所有的英文分隔符都放到字符類【】中去呢?這是因為對於--(破折號)...(省略號) ()(小括號)   [](中括號) {}(大括號)這些分隔符或者會引起歧義不能正確表達出來,或者必須使用\來轉義。

 

4.否定驗證

  • \b[A-GI-Z]+\b可以驗證任何沒有字母H的英文單詞
  • \b[A-GI-OQ-Z]\b可以驗證任何沒有字母H和P的英文單詞
  • \b[A-Z]*B[^P][A-Z]*\b可以驗證任何在B之后沒有P的英文單詞。
  • 但是為什么DAFB沒有被匹配上呢?這是因為在B之后[^P]占了一個位置,即最后一定不能什么都沒有。

 

5.具有相同特征的英文單詞驗證

  a、使用\b([A-Z])\1[A-Z]*\b可以驗證具有兩個相同字母開頭特征的英文單詞。因為\1是在反向引用第一個分組。

  b、使用\b([A-Z])[A-Z]*\1+[A-Z]*\b可以驗證具有一個和首字母相同的字母特征的英文單詞。

  舉例如下所示:

 

 

第二部分:6種非單詞字符的驗證

  這一部分將介紹非單詞字符串的驗證,比如英文標點符號、中文標點符號、中文文本驗證、特殊字符驗證和密碼驗證。

1.英文標點符號的驗證

  即如下所示,在上面我們已經見過了:

[-,.?:;'"!`]|(-{2})|(\.{3})|(\(\))|(\[\])|({})

 

2.中文標點符號驗證

  中文標點符號也很多並且和英文標點符號很類似。如 ,(逗號) 。(句號) ?(問號) :(冒號) ;(分號) ‘’(單引號) !(感嘆號)  “”(雙引號)  —(連接號)  ——(破折號)  ……(省略號)  ()(小括號)  【】(中括號)  {}(大括號)  、(頓號)  《》(書名號) 等等。

  於是我們可以通過下面的正則表達式來驗證:

[,。?:;“” ‘’ !— …… 、]|(—{2})|(())|(【】)|({})|(《》)

其中(—{2})用來匹配破折號

 

3.中文文本驗證

  中文文本的驗證比較簡單,我們直接使用/w即可實現。如下圖所示:

    

  需要注意的是,如果沒有u(注意觀察灰色部分),則不能正確匹配,在http://www.regexpal.com/中我打開了unicode之后才可以正常匹配。

 

 

 

4.特殊字符驗證  

  我們認為除了數字和字母之外的字符都是特殊字符,具體包括 、_ = \ [ ] ; ' ,. / ~ ! @ # $ % ^ & * ( ) + | ? > < “ :{ }。

  使用以下正則表達式即可驗證一個特殊字符:

 [、_ =\ \\ [\ ] ; ' ,. / ~ ! @ # $ % ^ & * ( ) + | ? > < “ :{}]

  其中\ [ ]需要通過使用\進行轉義。

  當然,如果需要驗證長度至少為1、由特殊字符串組成的字符串,可直接在上面的正則表達式右邊添加+即可。

 

5.密碼驗證

  當用戶登陸網站時,一般都需要用戶輸入用戶名和密碼,這時作為前端攻城獅的我們就需要進行驗證了。當然,一般來說,密碼的復雜程度越高,用戶信息安全性越高。

  密碼字符可以包括數字、字母和特殊字符。因此在一個密碼中可以只有數字或只有字母或只有特殊字符,也可以同時擁有其中的兩種,或同時擁有其中的三種,顯然,擁有的種類越多,則改密碼越安全。

A 只包含數字的密碼驗證

  這種形式的驗證顯然是非常簡單的,其安全性也非常低。如下所示:

\d+

  這樣的表達式可以驗證數字個數大於等於1的密碼。而一般我們輸入密碼時有具體的要求,比如6到12位,我們可以按照下面的方式來驗證。

\d{6,12}

  

B 只包含字母的密碼驗證

  這也很簡單,同樣安全性較差。我們可以這樣驗證限制在6-12位的密碼。

 

C 只包含特殊字符的密碼驗證

  同樣很簡單,即

 [、_=\\\[\];`',./~!@#$%^&*()+|?><":{}]{6,12}

  此正則表達式驗證的是6到12位的純特殊字符的密碼。

 

D 包含數字和字母的密碼驗證

  這里似乎很簡單,但實際上卻不是,因為我們必須保證數字和字母同時都有。我的思考如下(如果大家覺得有更簡潔的方式可以提出來):

[\da-zA-Z]*((\d+[a-zA-Z]+)|([a-zA-Z]+\d+))[\da-zA-Z]*

  其中中間的分組(第一個分組)((\d+[a-zA-Z]+)|([a-zA-Z]+\d+))表示這個密碼中必須是一個或幾個數字后面跟着一個或幾個字母 或者 一個或幾個字母后面跟着一個或幾個數字。如45dda或da564這種形式,如果一個密碼時555或daf這肯定是不能匹配的。但這還是不夠的,如果我們還希望在45dda的左邊有字母,右邊還有數字時,我們就需要在兩邊添加[\da-zA-Z]*了,其中*表示0個或多個。

 

E 包含數字和特殊字符的密碼驗證

  在D的基礎上,這里的正則表達式就很好寫了,只需將字母的驗證替換為特殊字符的驗證即可,如下所示:

[\d、_=\\\[\];`',./~!@#$%^&*()+|?><":{}]*((\d+[、_=\\\[\];`',./~!@#$%^&*()+|?><":{}]+)|([、_=\\\[\];`',./~!@#$%^&*()+|?><":{}]+\d+))[\d、_=\\\[\];`',./~!@#$%^&*()+|?><":{}]*

 

F 包含字母和特殊字符的密碼驗證

  在E的基礎上,我們直接將其中的數字用字母來替換即可,如下所示:

[a-zA-Z_=\\\[\];`',./~!@#$%^&*()+|?><":{}]*(((a-zA-Z)+[_=\\\[\];`',./~!@#$%^&*()+|?><":{}]+)|([_=\\\[\];`',./~!@#$%^&*()+|?><":{}]+(a-zA-Z)+))[a-zA-Z_=\\\[\];`',./~!@#$%^&*()+|?><":{}]*

  這里為什么驗證不成功呢??  如果有大神了解,希望可以給予指導,感激。

 

G 包含字母、數字和特殊字符的密碼驗證

  如果三者都包含,那么此時密碼的安全度是最高的。那么,怎么實現這樣的密碼驗證呢?

  思路同樣的,即左右兩邊需要有字母、數字、字符串同時放在一個字符類里,中間的分組需要通過6次或運算即可實現。

  

  

第三部分:文件名稱驗證

   每一個文件都有它自己的名稱,該名稱由兩部分組成:文件名和文件擴展名。基於此,下面我們將要介紹 指定文件擴展名的驗證、 指定文件名的驗證、 包含指定字符串的文件全名的驗證、 排除兩端存在空白符的文件全名驗證。

1. 指定文件擴展名的驗證 

  假設我們驗證文件擴展名為pdf的名稱。驗證時,文件名是長度至少為1的任意字符串。方法如下:

      

  其中.+表示匹配長度至少為1、由非換行符組成的字符串。\.是為了對.進行轉義。

2. 指定文件名的驗證

  假設我們驗證文件名為javascript的名稱。驗證時,文件擴展名是長度至少為1的單詞字符串。方法如下:

      

 

3. 包含指定字符串的文件全民名驗證

  這種驗證方法是非常常見的,即一個文件全名中需要包含指定的字符串,比如一個文件全民中必須包含java這個字符串。驗證方法如下:

  

 

4. 排除兩端存在空白字符的文件全名驗證

  前面我們沒有考慮到文件名兩端存在空白字符的情況,然而,文件名的兩端是不允許存在空白字符的。 

   (1)如果驗證一個字符串不是以空白字符開頭,可用(?!expression),即零寬度負預測先行斷言。該斷言可以指定此位置的后面不能匹配表達式expression,於是驗證如下:

    

   (2) 如果驗證一個字符串不是以空白字符結束,可用(?<!expression),即零寬度負回顧后發斷言,它斷言自身位置的前面不能匹配表達式expression,於是驗證如下:

^.+(?<! )\.\w+$

 

(3) 結合上面兩種情況,即可得到文件名兩端都不存在空格的驗證如下所示:

^(?! ).+(?<! )\.\w+$

 

 

第四部分:電子郵件、HTTP/FTP地址驗證

  這四個都是網絡的常用元素,尤其是電子郵件的驗證用的很多。

1.電子郵件驗證

   我們知道常見的電子郵箱有163 郵箱 126 郵箱 QQ 郵箱 Gmail郵箱 雅虎郵箱 Hotmail 新浪郵箱 139 郵箱 TOM郵箱 21CN郵箱 搜狗郵箱 189郵箱 188財富郵億郵 Yeah郵箱 搜狐郵箱 Foxmail等等,但是他們的特點都十分類似,如qq郵箱地址:1843021156@qq.com,Gmail郵箱地址 zhuzhenwei789@gmail.com等等。當然上述的郵箱是大型公司提供的免費郵箱。 公司還可以有自己的企業郵箱。比如123456abcd@facai.com.cn等等。

  綜上所述,我們可以看出郵箱一般是由名稱、字符@和域名后綴組成。

  根據郵箱的特點,我們便可以使用下面的正則表達式來驗證電子郵件地址:

^\w+@(\w+\.)+\w+

  效果如下所示:

  當然,下面這種方法(思路)也是一樣的:

^\w+@\w+(\.\w+)+

  上面的說法是有問題的,這里更正,應該是 

^[\w.]+@(\w+\.)+\w+

  因為前面的名稱也有可能是有小數點的。

2.HTTP、FTP地址驗證

   HTTP地址一般是以字符串"http://"或"https:"開頭的字符串。它可以被. / ? & % =分割。 如http://www.cnblogs.com、https://www.baidu.com/s?wd=谷歌&rsv_spt=1、http://cn.bing.com/search?q=javascript等等。而FTP和HTTP的唯一區別在於開頭是FTP而不是HTTP或HTTPS。

      於是可知驗證表達式如下:

((http|ftp|https)://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\&%_\./-~-]*)?

       首先該正則表達式匹配的字符串必須以http://、https://、ftp://開頭;

       其次該正則表達式能匹配URL或者IP地址;(如:http://www.baidu.com 或者 http://192.168.1.1)

      然后該正則表達式能匹配到URL的末尾,即能匹配到子URL;(如能匹配:http://www.baidu.com/s?wd=a&rsv_spt=1&issp=1&rsv_bp=0&ie=utf-8&tn=baiduhome_pg&inputT=1236)

      最后該正則表達式能夠匹配端口號;

 

 

結語:

  這篇文章寫完才發現對正則表達式的理解還不夠透徹,比如字母、數字、特殊字符構成的密碼驗證還有些問題待解決,最后HTTP和FTP的驗證我覺得寫的也過於繁雜,並沒有解決所有問題。所以如果大家有什么好的建議希望可以指教,在此表示感謝。

 

 

注:原創文章,如需轉載,請注明出處,博客地址:http://www.cnblogs.com/zhuzhenwei918/p/6202932.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM