iOS正則的基本使用

正則表達(dá)式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。這種公式語法優(yōu)美簡潔,經(jīng)常被我們開發(fā)用來匹配字符串,封裝成各種判斷方法;

image

正則表達(dá)式

先舉個簡單例子,比如輸入框輸入一個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.comtest@sina.vip.comte-st@qq.com.cnte_st@sina.vip.comt.e_st@si-na.vip.com2、開始必須是一個或者多個單詞字符中間或穿插特殊字符-._,加上@,然后又是一個或者多個單詞字符或者是-.。然后是點(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 = [NSPredicatepredicateWithFormat:@"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]$//其中\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]+.*$


OC中正則表達(dá)式的使用步驟:

編寫正則表達(dá)式的樣式:

NSString *string= @"5347858h7";

初始化正則表達(dá)式:

NSRegularExpression*regex = [[NSRegularExpressionalloc] initWithPattern:pattern options:0 error:nil];

匹配字符串并返回結(jié)果:

NSArray *results = [regex matchesInString:stringoptions:0range:NSMakeRange(0,string.length)];

輸出結(jié)果:

for(NSTextCheckingResult*resultinresults) {
NSLog(@"范圍:%@ 結(jié)果:%@",NSStringFromRange(result.range), [string substringWithRange:result.range]);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容