前言
基本上每個 App 都有登錄注冊功能基公,在登錄注冊時需要驗證用戶所輸入的內(nèi)容是否符合規(guī)定;有時要在字符串中查找并截取符合要求的字符串空凸,這時就需要用到正則表達式避矢。正則表達式看起來晦澀難懂,沒有什么規(guī)律可循龟再,但是我們并不用深入研究书闸,只需要簡單了解,滿足日常開發(fā)即可利凑。
什么是正則表達式浆劲?
正則表達式就是用一個“字符串”來描述一個特征,然后去驗證另一個“字符串”是否符合這個特征哀澈。比如 表達式“ab+” 描述的特征是“一個 'a' 和 任意個 'b' ”牌借,那么 'ab', 'abb', 'abbbb' 都符合這個特征。
正則表達式可以用來做什么割按?
- 驗證字符串是否符合指定特征膨报,比如驗證是否是合法的郵件地址。
- 用來查找字符串适荣,從一個長的文本中查找符合指定特征的字符串现柠,比查找固定字符串更加靈活方便。
- 用來替換束凑,比普通的替換更強大。
元字符
正則表達式語言由兩種基本字符類型組成:原義文本字符和元字符汪诉。
元字符使正則表達式具有處理能力谈秫。所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符鱼鼓,可以用來規(guī)定其前導(dǎo)字符(即位于元字符前面的字符)在目標對象中的出現(xiàn)模式拟烫。
常用元字符:
元字符 | 描述 |
---|---|
^ | 匹配輸入字符串開始的位置 |
$ | 匹配輸入字符串結(jié)尾的位置 |
. | 匹配除換行符以外的任意字符 |
| | 或 |
, | 分割 |
[ ] | 包含,默認是一個字符長度 |
[0-9] | 匹配0到9的數(shù)字 |
[a-z] | 匹配小寫字母 |
[A-Z] | 匹配大寫字母 |
[A-Za-z] | 匹配字母 |
[A-Za-z0-9] | 匹配字母數(shù)字 |
[^] | 不包含,默認是一個字符長度 |
{n} | 重復(fù)n次 |
{n,} | 重復(fù)≥n次 |
{n,m} | 重復(fù)≥n且≤m次 |
* | 重復(fù)零次或更多次 |
+ | 重復(fù)一次或更多次 |
? | 重復(fù)零次或一次 |
\ | 轉(zhuǎn)義 |
\d | 匹配數(shù)字 |
\w | 匹配字母迄本、數(shù)字或下劃線字符 |
\s | 匹配空白字符:空格、制表符嘉赎、換頁符等 |
\D | 匹配非數(shù)字字符 |
\W | 匹配所有與\w不匹配的字符 |
\S | 匹配非空白字符 |
這里只列舉了比較常用的元字符置媳,如果想查看更多,戳這里公条。
小插曲:熟悉Markdown語法的應(yīng)該知道拇囊,制表需要使用到"|"靶橱,如果要在表內(nèi)顯示這個符號要怎么做呢?轉(zhuǎn)義关霸、|、0x2502這些試過了都不行膘掰,最后從別的地方復(fù)制了一個中文的"|"才在表中顯示出來了英上。如果有別的方法炭序,可以一起交流討論下苍日。
補充:
問:[0-9]和\d有什么區(qū)別窗声?
答:\d匹配的是Unicode相恃,要篩選各種語言里的數(shù)字字符:
012345789???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
[0-9]匹配的是阿拉伯數(shù)字:0123456789
所以[0-9]的效率更高拦耐。
例子 :
只是知道了元字符的含義可能還是不能很好地理解正則表達式,通過對照上表和下面例子來加深一下理解:
手機號:
- 11位數(shù)字:^[0-9]{11}$杀糯,[0-9]表示0到9的數(shù)字苍苞,{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次
常用正則表達式
- 用戶名和密碼翅楼,由6~16位字母、數(shù)字理茎、下劃線組成且第一位是字母:
^[a-zA-Z]\w{5,15}$ - 電話號碼:
^(\d{3,4}-)\d{7,8}$ - 手機號碼:
^1[3|4|5|7|8][0-9]{9}$ - 身份證號(15位或18位數(shù)字):
^\d{14}[[0-9],0-9xX]$ - Email地址:
^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)$* - URL:
^http://([\w-]+.)+[\w-]+(/[\w-./?%&=])?$* - QQ號(從10000開始):
^[1-9][0-9]{4,}$ - 中國郵政編碼:
^[1-9]\d{5}$ - n位的數(shù)字:
^\d{n}$ - 至少n位的數(shù)字:
^\d{n,}$ - m~n位的數(shù)字:
^\d{m,n}$ - 整數(shù)或者小數(shù):
^[0-9]+([.][0-9]+){0,1}$ - 有1~3位小數(shù)的正實數(shù):
^[0-9]+(.[0-9]{1,3})?$ - 漢字:
^[\u4e00-\u9fa5]{0,}$
正則表達式在iOS中的使用
注意:在寫正則表達式時:所有的""都需要轉(zhuǎn)義管嬉,即:"\\"
1.NSPredicate(驗證字符串):
// 要驗證的字符串
NSString *phoneNumber = @"15212345678";
// 編寫正則表達式
NSString *regular = @"^1[3|4|5|7|8][0-9]{9}$";
// 創(chuàng)建謂詞對象并設(shè)定條件的表達式
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regular];
// 對字符串判斷,該方法會返回BOOL值
[numberPre evaluateWithObject:phoneNumber];
2.NSString(查找字符串):
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask;
NSString *string = @"手機號:15212345678";
NSRange range = [string rangeOfString:@"^1[3|4|5|7|8][0-9]{9}$" options:NSRegularExpressionSearch];
if (range.location != NSNotFound) { // 判斷是否查找到
// 查找到
} else {
// 未查找到
}
3.NSRegularExpression(查找字符串):
NSString *string = @"手機號:15212345678";
NSError *error;
// 創(chuàng)建NSRegularExpression對象并指定正則表達式
NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:@"^1[3|4|5|7|8][0-9]{9}$"
options:0
error:&error];
if (!error) { // 如果沒有錯誤
// 獲取特定字符串的范圍
NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
if (match) {
// 截獲特定的字符串
NSString *result = [string substringWithRange:match.range];
NSLog(@"%@", result);
}
} else { // 如果有錯誤础倍,則把錯誤打印出來
NSLog(@"error - %@", error);
}
結(jié)語:
正則表達式的知識遠遠不止這些胎挎,不過以上內(nèi)容就可以滿足日常開發(fā)了扰楼。以后有時間的話會再深入了解的美浦。
如有錯誤之處,還請指正蹬竖。