標籤:
問題引入
1.要驗證使用者輸入的密碼長度是否滿足6~18位的長度
^.{6,18}$
2.固定電話都是0區號-八位元字的格式,那麼Regex的匹配如下
^0\\d{2}\-?\\d{8}$
3.對於密碼強度的認證。如今的密碼應該包括一個或以上的大寫字母以及小寫字母,對此Regex的匹配是
(^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$)
符號解析
1.{6,18}表示6-18位。其中,{n}匹配字元重複n次,{n,}匹配重複n次或更多次;{n,m}匹配重複n到m之間次數。
2. ^和$屬於特殊符號,^表示匹配字串的開頭,$表示匹配字串的結尾。 .符號表示任一字元(除分行符號之外),\d用來表示任意的單個數字,\w表示任意一個字母或數字或者直接使用0-9的任一數字表示具體數字。而特殊符號?表示前一個字元為0或者1個,*表示前一個值重複0次或者更多次。
{6,18}這個特殊符號表示的是前一個符號代表的位元。結合起來說^.{6,18}$匹配一段6至18位長度的字串
我們可以把
^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$
拆分成 ^.*[A-Z]+.*[a-z]+.*$ 跟 ^.*[a-z]+.*[A-Z]+.*$
拆分運算式的方法:我把運算式的字元分為兩類:值表達和修飾表達。所謂值表達就是說這個符號表示了某個值,就像\d表示數字,.表示任意非分行符號字元。修飾表達用來修飾值達成某種條件,比如{2}表示前面一個值重複兩次。
^.*[A-Z]+.*[a-z]+.*$可以拆分成部分:^$、 .* 、 [A-Z]+ 、 [a-z]+。
^$就不再多說。
.*這裡要介紹的就是*表示前一個值符號重複任意次數。
[A-Z]+中-表示從左邊的值到右邊的值之間所有值形成的閉集合;[]方括弧表示的值必須是括弧中間集合的子集,要注意的是括弧裡面可以有多個集合,比如[A-Z0-9a-z]表示匹配任意一個大小寫字母或數字;+同*有點像,但是+表示的是至少一個的重複值。
結合上面的解析,那麼^.*[A-Z]+.*[a-z]+.*$表示以任意數量的字元開頭,然後跟著一個大寫字母,大寫字母後面有任意數量的字元以及一個小寫字母,然後又是任意數量的數字、字母或者字元。而^.*[a-z]+.*[A-Z]+.*$表示小寫字母在大寫字母前面任意數量的字元的位置,兩個結合匹配可以確保字串中包括至少一個小寫字母和一個大寫字母。
ps:有一點要注意,上面展示的運算式解析時\d這些特殊符號在我們的代碼中多了一個\,這是因為\本身是轉義符號,為了保證運算式能正常匹配,我們要給\進行一次轉義,所以就變成了\\。基本上所有的符號字元都需要轉義。
文法/字元說明表
值表達
. 匹配除分行符號外的任一字元
\w 匹配字母或者數位字元
\W 匹配任意不是字母或數位字元
\s 匹配任意的空白符(空格、定位字元、分行符號)
\S 匹配任意不是空白符的字元
\d 匹配任一數字
\D 匹配任意非數位字元
\b 匹配單詞的結尾或者開頭的字元
\B 匹配任意不是單詞結尾或開頭的字元
[^x] 匹配任意非x的字元。如[^[a-z]]匹配非小寫字母的任一字元
^ 匹配字串的開頭
$ 匹配字串的結尾
修飾表達
* 匹配重複任意次數
+ 匹配重複一次以上的次數
? 匹配一次或零次
{n} 匹配重複n次
{n,} 匹配重複n次或n次以上
{n,m} 匹配重複最少n次最多m次
參考:
原文連結:http://www.jianshu.com/p/00da4d87b777
iOS正則表達