前言
在實際開發(fā)中份名,基本每一個APP都會有登錄注冊功能箱吕,在登錄注冊時需要驗證用戶輸入的內(nèi)容是否符合規(guī)定荣病;甚至有時需要在字符串中查找截取符合要求的字符串栋操,這時就需要使用到正則表達式闸餐。正則表達式看起來特別難,沒有什么規(guī)律可循矾芙,我個人認(rèn)為我們并沒有必要去深入的研究舍沙,搞懂日常開發(fā)中經(jīng)常會使用到的即可!
正則表達式是什么鬼剔宪?
正則表達式就是用“字符串”來描述一種規(guī)則特征拂铡,然后再去驗證另外一個“字符串”是否符合這個特征。Eg:表達式“ab+”描述的特征為:驗證字符串包含一個"a"和N個(N >= 1)b,類似"ab"葱绒、"abb"感帅、"abbb"都符合這個特征。
正則表達式可以用來干什么哈街?
1.驗證字符串是否符合指定特征留瞳,比如驗證是否為合法郵箱地址;
2.用來查找字符串骚秦,從一個長的文本中查找符合指定特征的字符串她倘,比如查找固定字符串更加靈活便捷;
3.進行字符串替換作箍,比較普通替換更加強大硬梁;
元字符
正則表達式預(yù)言由兩種基本字符類型組成:原義文本字符和元字符
元字符使正則表達式具有處理能力,所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符胞得,可以用來規(guī)定其前導(dǎo)字符(即位于元字符前面的字符)在目標(biāo)對象中的出現(xiàn)模式
常用元字符
元字符 | 描述 |
---|---|
^ | 匹配輸入字符串開始位置 |
$ | 匹配輸入字符串結(jié)束為止 |
. | 匹配除換行意外的任意字符 |
| | 或 |
, | 分割 |
[] | 包含荧止,默認(rèn)一個字符長度 |
[0-9] | 匹配0~9的數(shù)字 |
[a-z] | 匹配小寫英文字母 |
[A-Z] | 匹配大寫英文字母 |
[a-zA-Z] | 匹配英文字母 |
[a-zA-Z0-9] | 匹配英文字母數(shù)字 |
[^] | 不包含,默認(rèn)一個字符長度 |
{n} | 重復(fù)n次 |
{n,} | 重復(fù)>= n次 |
{n,m} | n<= 重復(fù)次數(shù) <= m |
* | 重復(fù)次數(shù) >= 0 |
+ | 重復(fù)次數(shù) >=1 |
? | 重復(fù)次數(shù)0次或1次 |
\ | 轉(zhuǎn)義字符 |
\d | 匹配數(shù)字 |
\w | 匹配字母、數(shù)字或下劃線 |
\s | 匹配空白字符:空格跃巡、制表符危号、換頁符等 |
\D | 匹配非數(shù)字字符 |
\W | 匹配所有與非字母、非數(shù)字素邪、非下劃線字符 |
\S | 匹配非空白字符 |
簡單說明
Question:[0-9] 和 \d 區(qū)別
\d匹配的是Unicode,要進行各種語言中數(shù)字字符的篩選:
012345789???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
[0-9]匹配的則是阿拉伯?dāng)?shù)字:0 1 2 3 4 5 6 7 8 9
相比較而言[0-9]的匹配效率更高一點;
簡單舉例說明一下如何使用上述元字符
手機號碼正則匹配
- 11位數(shù)字匹配:^[0-9]{11}$,[0-9]表示阿拉伯?dāng)?shù)字0~9外莲,{11}表示重復(fù)11次;
- 11位數(shù)字,第一位為"1":^1[0-9]{10}$,1表示開始位置為"1",[0-9]{10}表示0~9的數(shù)字重復(fù)10次
- 11位數(shù)字兔朦,第一位為"1",第二位為"3"偷线、"4"、"5"沽甥、"7"声邦、"8":^1[3|4|5|7|8][0-9]{9}&1表示第一位是1,[3|4|5|7|8]表示第二位是3摆舟、4亥曹、5、7或8盏檐,[0-9]{9}表示0到9的數(shù)字重復(fù)9次
常用正則表達式
- 身份證號碼
NSString *regex = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
- 英文字母開頭
NSString *ZIMU = @"^[A-Za-z]+$";
- 郵箱地址
NSString *regex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
- 手機號碼
/**
* 手機號碼
* 移動:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
* 聯(lián)通:130,131,132,152,155,156,185,186
* 電信:133,1349,153,180,189
*/
NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
/**
* 中國移動:China Mobile
* 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
*/
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
/**
* 中國聯(lián)通:China Unicom
* 130,131,132,152,155,156,185,186
*/
NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
/**
* 中國電信:China Telecom
* 133,1349,153,180,189
*/
NSString * CT = @"^1((33|53|77|8[019])[0-9]|349)\\d{7}$";
/**
* 大陸地區(qū)固話及小靈通
* 區(qū)號:010,020,021,022,023,024,025,027,028,029
* 號碼:七位或八位
*/
- 網(wǎng)址鏈接
NSString *regex = @"http(s)?:\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- .\\/?%&=]*)?";
- 護照
/** 第一位是字母歇式,后面都是數(shù)字
P:P開頭的是因公普通護照
D:外交護照是D開頭
E: 有電子芯片的普通護照為“E”字開頭,
S: 后接8位阿拉伯?dāng)?shù)字公務(wù)護照
G:因私護照G開頭
14:
15:
H:香港特區(qū)護照和香港公民所持回鄉(xiāng)卡H開頭,后接10位數(shù)字
M:澳門特區(qū)護照和澳門公民所持回鄉(xiāng)卡M開頭,后接10位數(shù)字
*/
NSString *regex = @"^1[45][0-9]{7}|([P|p|S|s]\\d{7})|([S|s|G|g]\\d{8})|([Gg|Tt|Ss|Ll|Qq|Dd|Aa|Ff]\\d{8})|([H|h|M|m]\\d{8胡野,10})$";
- 汽車車牌號
NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$";
- 驗證碼
NSString *regex = @"^(\\d{6})";
- 用戶名
NSString *userNameRegex = @"^[A-Za-z0-9]{4,20}+$";
- 密碼
NSString *passWordRegex = @"^[a-zA-Z0-9]{6,20}+$";
- 密碼強度
NSString *regex = @"^(?=.*\\d.*)(?=.*[a-zA-Z].*).{6,20}$";
- 昵稱
NSString *nicknameRegex = @"([\u4e00-\u9fa5]{2,5})(·[\u4e00-\u9fa5]{2,5})*";
- 銀行卡號
NSString *regex = @"^(\\d{15,30})";
- 銀行卡號后四位
NSString *regex = @"^(\\d{4})";
- 全英文字母
NSString *reges = @"^[A-Za-z]+$";
- 全英文大寫字母
NSString *reges = @"^[A-Z]+$";
- 全英文小寫字母
NSString *reges = @"^[a-z]+$";
- 全英文字母數(shù)字
NSString *reges = @"^[A-Za-z0-9]+$";
現(xiàn)在我們說說iOS開發(fā)者中如何使用這些正則表達式:
1.NSPredicate(驗證字符串):
// 需要驗證的字符串
NSString *mobilePhone = @"13227008888";
// 編寫正則表達式材失,驗證mobilePhone是否為手機號碼
NSString *regex = @"^1[3|4|5|7|8][0-9]{9}$";
// 創(chuàng)建謂詞對象并設(shè)定條件表達式
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
// 字符串判斷,然后BOOL值
BOOL result = [predicate evaluateWithObject:mobilePhone];
NSLog(@"result : %@",result ? @"正規(guī)手機號碼" : @"驗證失敗");
// result : 正規(guī)手機號碼
2.NSString 字符串查找
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask;
NSRange range = [mobilePhone rangeOfString:regex options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
// 找到
NSLog(@"%@",NSStringFromRange(range));
}else{
//未找到
}
3.NSRegularExpression(查找字符串):
NSError *error;
NSString *rangeRegex = @"[8]{4}";
NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:rangeRegex options:0 error:&error];
if (!error) {
NSTextCheckingResult *match = [regular firstMatchInString:mobilePhone options:0 range:NSMakeRange(0, [mobilePhone length])];
if (match) {
NSString *result = [mobilePhone substringWithRange:match.range];
NSLog(@"%@",result);
}
}else{
NSLog(@"error -- %@",error);
}
結(jié)束語
到這里硫豆,我們基本已經(jīng)掌握了常用開發(fā)中的所有正則表達式的使用和如何使用元字符創(chuàng)建一個正則表達式龙巨。
文章中的相關(guān)正則表達式已經(jīng)在GitHub中上傳了相關(guān)代碼,并且大家可以使用CocoaPods進行搜索導(dǎo)入熊响!歡迎大家使用旨别!
pod search WYQRegexHelper
-> WYQRegexHelper (0.0.1)
提供iOS開發(fā)常用正則表達式
pod 'WYQRegexHelper', '~> 0.0.1'
- Homepage: https://github.com/YongQiangWei/RegularExpressionTool
- Source: https://github.com/YongQiangWei/RegularExpressionTool.git
- Versions: 0.0.1 [master repo]
(END)