正則表達(dá)式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。這種公式語法優(yōu)美簡潔,經(jīng)常被我們開發(fā)用來匹配字符串,封裝成各種判斷方法;
先舉個簡單例子,比如輸入框輸入一個6~12位的密碼,很多人會這樣寫:
if (textField.text.length >= 6 && textField.text.leng <= 12);
這樣寫沒有錯,也是絕大多部分同學(xué)寫的方法,但是你用正則表達(dá)式判斷則是:
^.{6,12}$
是不是非常簡潔?再比如純數(shù)字驗(yàn)證:
^[0-9]+$
可能初學(xué)者并不懂上面的符號代表著什么意思,現(xiàn)在我為大家解釋下什么意思:
1、^和$屬于特殊符號,他們的作用是分別指出一個字符串的開始和結(jié)束
例:“^one”:表示所有以”one”開始的字符串(”one mouse”,”one123456″,·····);
相當(dāng)于iOS的方法:- (BOOL)hasPrefix:(NSString *)aString;
“a dog$”:表示所以以”a dog”結(jié)尾的字符串(”this is a dog”,·····);
類似于:- (BOOL)hasSuffix:(NSString *)aString;
2、{n}表示匹配字符重復(fù)n次;{n,}匹配重復(fù)n次或更多次;{n,m}匹配重復(fù)n到m之間次數(shù)。所以{6,12}則表示6~12位字符
3、.符號表示任一字符(除換行符之外),所以{6,12}跟在.符號后面則表示6至12位長度的字符串,所以^.{6,12}$
能夠匹配密碼;
4、[0-9]:表示一個字符串包含'0'到'9'中的一個;
5、+表示后面跟著至少一個前一位的字符;所以^[0-9]+$
可以匹配純數(shù)字;
解釋到應(yīng)該上面兩個正則表達(dá)式感覺很簡單,是不是瞬間也覺得該語法也特別精悍,不過整個語法不可能這么簡單,比如下面的表達(dá)式:
^0\\d{2}\-?\\d{8}$
我們慢慢分析一下:
1、.符號上面說了表示任一字符(除換行符之外),但是.符號是不限制字符的,匹配度太高,所以該語法又提供了\d表示任意的單個數(shù)字,\w表示26個字母;\s表示空格Tab換行;
2、{n}表示匹配字符重復(fù)n次
3、?表示前一個字符為0或者1個;
綜上所述,上面的表達(dá)式表示以0開頭接著兩位數(shù)字,再接著一個'-'符號或者沒有'-'符號,后面再接著8位數(shù)字,所以大概寫一下是不是也很熟悉?010-13236782或者01013236782,沒錯,這就是中國固定電話的匹配方式,因?yàn)榇蟛糠值墓潭娫挾际?區(qū)號-八位數(shù)字的格式!
不過有人會問,表達(dá)式是\\d而不是\d,這如何解釋?
**注意:這是因?yàn)閈本身是轉(zhuǎn)義符號,為了保證表達(dá)式能正常匹配,我們要給\進(jìn)行一次轉(zhuǎn)義,所以就變成了\\ **
//需要轉(zhuǎn)義的字符
* + ? $ ^ . | \ ( ) { } [ ]
下面就列舉下正則表達(dá)式的基本語法:
’^'和’$'表示一個字符串的開始和結(jié)束
‘’,’+'和’?'這三個符號,表示一個或N個字符重復(fù)出現(xiàn)的次數(shù)。它們分別表示“沒有或更多”([0,+∞]取整),“一次或更多”([1,+∞]取整),“沒有或一次”([0,1]取整)。下面是幾個例子:
“ab”:表示一個字符串有一個a后面跟著零個或若干個b(”a”, “ab”, “abbb”,……);
“ab+”:表示一個字符串有一個a后面跟著至少一個b或者更多( ”ab”, “abbb”,……);
“ab?”:表示一個字符串有一個a后面跟著零個或者一個b( ”a”, “ab”);
“a?b+$”:表示在字符串的末尾有零個或一個a跟著一個或幾個b( ”b”, “ab”,”bb”,”abb”,……)。
可以用大括號括起來({}),表示一個重復(fù)的具體范圍。例如
“ab{4}”:表示一個字符串有一個a跟著4個b(”abbbb”);
“ab{1,}”:表示一個字符串有一個a跟著至少1個b(”ab”,”abb”,”abbb”,……);
“ab{3,4}”:表示一個字符串有一個a跟著3到4個b(”abbb”,”abbbb”)。那么,“”可以用{0,}表示,“+”可以用{1,}表示,“?”可以用{0,1}表示
注意:可以沒有下限,但是不能沒有上限!例如“ab{,5}”是錯誤的寫法
“ | ”表示“或”操作:
“a|b”:表示一個字符串里有”a”或者”b”;
“(a|bcd)ef”:表示”aef”或”bcdef”;
“(a|b)*c”:表示一串”a”"b”混合的字符串后面跟一個”c”;
方括號”[ ]“表示在括號內(nèi)的眾多字符中,選擇1-N個括號內(nèi)的符合語法的字符作為結(jié)果,例如
“[ab]“:表示一個字符串有一個”a”或”b”(相當(dāng)于”a|b”);
“[a-d]“:表示一個字符串包含小寫的’a'到’d'中的一個(相當(dāng)于”a|b|c|d”或者”[abcd]“);
“^[a-zA-Z]“:表示一個以字母開頭的字符串;
“[0-9]a”:表示a前有一位的數(shù)字;
“[a-zA-Z0-9]$”:表示一個字符串以一個字母或數(shù)字結(jié)束。
“.”匹配除“\r\n”之外的任何單個字符:
“a.[a-z]“:表示一個字符串有一個”a”后面跟著一個任意字符和一個小寫字母;
“^.{5}$”:表示任意1個長度為5的字符串;
“\num” 其中num是一個正整數(shù)。表示”\num”之前的字符出現(xiàn)相同的個數(shù),例如
“(.)\1″:表示兩個連續(xù)的相同字符。
“10{1,2}” : 表示數(shù)字1后面跟著1或者2個0 (“10″,”100″)。
” 0{3,} ” 表示數(shù)字為至少3個連續(xù)的0 (“000”,“0000”,······)。
在方括號里用’'表示不希望出現(xiàn)的字符,’'應(yīng)在方括號里的第一位。
“@[^a-zA-Z]4@”表示兩個”@”中不應(yīng)該出現(xiàn)字母)。
常用的還有:
“ \d ”匹配一個數(shù)字字符。等價于[0-9]。
“ \D”匹配一個非數(shù)字字符。等價于[^0-9]。
“ \w ”匹配包括下劃線的任何單詞字符。等價于“[A-Za-z0-9_]”。
“ \W ”匹配任何非單詞字符。等價于“[^A-Za-z0-9_]”。
這里只是列舉了常用語法,想要知道更多,自行百度!
理解了基本語法,現(xiàn)在讓我們自己動手來實(shí)踐一下,比如怎么寫匹配電子郵箱的正則表達(dá)式:
1、首先先看看電子郵箱格式是怎樣的?
比如以下郵箱:
test@hotmail.com
test@sina.vip.com
te-st@qq.com.cn
te_st@sina.vip.com
t.e_st@si-na.vip.com
2、開始必須是一個或者多個單詞字符中間或穿插特殊字符-._,加上@,然后又是一個或者多個單詞字符或者是-.。然后是點(diǎn)“.”和單詞字符和-.的組合,可以有一個或者多個組合,郵箱域至少有一個“.”和兩個單詞,再嚴(yán)格點(diǎn)那么最后的頂級域至少要2個字母不能是數(shù)字,特殊字符不會出現(xiàn)在首尾兩端!
3、所以綜合上訴得出:
^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$
當(dāng)然,正則表達(dá)式不止一種寫法,有非常多的寫法,然后根據(jù)自己項(xiàng)目的規(guī)則也寫法不一樣,有些判斷的稍微寬松點(diǎn),這都是靈活性的,不要死板說別人的就是錯的,比如[參考]楊元慶@聯(lián)想.中國這樣都是可以的呢,規(guī)則一直在變!
在iOS里面運(yùn)用正則表達(dá)式判斷需要用到謂詞NSPredicate
,代碼如下:
+ (BOOL)isValidateEmail:(NSString *)email {
NSString *emailRegex = @"^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:email];
}
所有用正則表達(dá)式判斷的都是上訴方法,只是改變表達(dá)式就可以,下面列舉了些常用的正則表達(dá)式:
1、手機(jī)號:^[1][34578]\\d{9}$
2、身份證號:^(\\d{14}|\\d{17})(\\d|[xX])$
電子郵箱:^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$
3、車牌號:^[\u4e00-\u9fff]{1}[a-zA-Z]{1}[-][a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fff]$//其中\(zhòng)u4e00-\u9fa5表示unicode編碼中漢字已編碼部分,\u9fa5-\u9fff是保留部分,將來可能會添加;湘K-DE829 香港車牌號碼:粵Z-J499港
4、mac地址:^([A-Fa-f\\d]{2}:){5}[A-Fa-f\\d]{2}$
5、url:^((http)|(https))+:[^\\s]+\\.[^\\s]*$
6、郵政編碼:^[1-9]\\d{5}(?!\d)$
7、漢字:^[\u4e00-\u9fa5]+$
8、是否含有^%&’,;=?$\”等字符:^[^%&’,;=?$\x22]+$
9、不允許特殊符號(如:用戶名6-20位):^[a-zA-Z0-9]{6,20}$
10、密碼強(qiáng)度(一個或以上的大寫字母以及小寫字母):^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$
到這,我想大家應(yīng)該對正則表達(dá)式有所了解了,不用自己完全對各種判斷寫的出來,至少對一個表達(dá)式我們看得懂;學(xué)無止境,想要知道的更多,趕快學(xué)習(xí)去吧。
轉(zhuǎn)載請注明出處:http://www.lxweimin.com/p/efbdd3464de4