正規表示式是一種用來進行文字匹配的工具,其語法優美簡潔。在開發中,查詢、對比以及匹配字串是家常便飯的業務,通過正規表示式我們將這些業務描述成某些需求規則,來讓我們的**更美觀、實用。例如我們要驗證使用者輸入的密碼長度是否滿足6~18位的長度,新手最常見的驗證方式是判斷輸入的密碼長度
return (textfield.text.length >= 6 && textfield.text.leng <= 18);
儘管這種判斷方式沒有任何問題,而上面的驗證換做正規表示式的匹配字元就顯得短小精悍
^.$還有,大部分的固定**都是0區號-八位數字的格式,那麼正規表示式的匹配如下
^0\\d\-?\\d$
再比如,對於密碼強度的認證。如今的密碼應該包括乙個或以上的大寫字母以及小寫字母,對此正規表示式的匹配是
(^.*[a-z]+.*[a-z]+.*$|^.*[a-z]+.*[a-z]+.*$)
表示式字元解析
如果是新手開發者,那麼很有可能不理解上面的正規表示式。那麼我們先看第乙個匹配條件,匹配6-18位的密碼長度。根據題目的要求,就能夠輕易的判斷出表示6-18位。其中,匹配字元重複n次;匹配重複n次或更多次;匹配重複n到m之間次數。
那麼讀者對^、.和$三個符號可能不明所以。^和$屬於特殊符號,前者表示匹配字串的開頭,後者表示匹配字串的結尾。由於我們有時需要在一段很長的字串中匹配某些小片段字串時(比如在**混編中匹配長字串中留空的表情符號),適當使用這兩個符號可以減少匹配次數,提高執行效率。
那麼結合這幾個字元代表含義,可以得出.符號表示任一字元(除換行符之外)。那麼還可以得出這個特殊符號表示的是前乙個符號代表的位數。結合起來說^.$匹配一段6至18位長度的字串,所以可以用來驗證密碼長度
當然了,.字元的匹配率太高,更多時候我們需要匹配的是具體到數字或者字母,甚至準確的數字和字母。那麼除了.字元以外,還有\d用來表示任意的單個數字,\w表示任意乙個字母或數字或者直接使用0-9的任意數字表示具體數字。而特殊符號?表示前乙個字元為0或者1個。
所以上面的^0\\d\-?\\d$匹配了以數字0開頭,接著兩個數字,後面跟著-號跟八個數字,然後結尾的字串,不管是010-88888888,還是02098989898都能進行正確匹配。
最後的乙個表示式可能是最複雜的表示式,根據上面對部分符號的解析。我們可以把
^.*[a-z]+.*[a-z]+.*$|^.*[a-z]+.*[a-z]+.*$
拆分成 ^.*[a-z]+.*[a-z]+.*$ 跟 ^.*[a-z]+.*[a-z]+.*$
這兩個單獨的表示式,而中間的|不難猜到就是邏輯的或。我們將對前乙個進行拆分,來一步步識別這個表示式的匹配規則。這裡教大家我拆分表示式的方法:我把表示式的字元分為兩類:值表達和修飾表達。所謂值表達就是說這個符號表示了某個值,就像\d表示數字,.表示任意非換行符字元。修飾表達用來修飾值達成某種條件,比如表示前面乙個值重複兩次,*表示前乙個值重複0次或者更多次。根據這種方法,那麼^.*[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次最多m次
**實操
上面我們只是簡單的講解了正規表示式中各個字元代表的意義,那麼在ios開發中應該怎麼使用。對於有意使用正則規則來匹配的開發者,我的建議是封裝成為類別方法,一次封裝,多次呼叫。下面用我自己封裝的**進行說明。這些方法通過擴充套件uitextfield方法來實現:
@inte***ce uitextfield (lxdvalidate)
/*! 判斷文字框是否為空(非正規表示式)*/
- (bool)isempty;
/*! 判斷郵箱是否正確*/
- (bool)validateemail;
/*! 判斷驗證碼是否正確*/
- (bool)validateauthen;
/*! 判斷密碼格式是否正確*/
- (bool)validatepassword;
/*! 判斷手機號碼是否正確*/
- (bool)validatephonenumber;
/*! 自己寫正則傳入進行判斷*/
- (bool)validatewithregexp: (nsstring *)regexp;
@end
方法實現檔案:?
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#import "uitextfield+lxdvalidate.h"
@implementation uitextfield (lxdvalidate)
- (bool)isempty
- (bool)validateemail
@[a-z-a-z]\\.[a-za-z]$"
];
}
- (bool)validateauthen
$"
];
}
- (bool)validatepassword
$"
;
//長度
nsstring * number = @
"^\\w*\\d+\\w*$"
;
//數字
nsstring * lower = @
"^\\w*[a-z]+\\w*$"
;
//小寫字母
nsstring * upper = @
"^\\w*[a-z]+\\w*$"
;
//大寫字母
return
[self validatewithregexp: length] && [self validatewithregexp: number] && [self validatewithregexp: lower] && [self validatewithregexp: upper];
}
- (bool)validatephonenumber
$"
;
return
[self validatewithregexp: reg];
}
- (bool)validatewithregexp: (nsstring *)regexp
@end
正規表示式 正規表示式 總結
非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...
正規表示式 表示式
網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...
Linux正規表示式 編寫正規表示式
為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...