前言
開發(fā)中經(jīng)常會用到正則表達式來匹配或者過濾目標字符串鼠锈,從而提高自己的開發(fā)效率岭粤。本文主要通過介紹正則表達式,讓你對正則表達式有一個基本的了解派昧,從而可以應用在自己的開發(fā)過程中(主要是iOS 開發(fā)中黔姜,文中會有demo講解),再次更深層次的學習不做講解蒂萎,文中有學習鏈接秆吵,有興趣的可以進行更深層次的研究。
簡介
正則表達式五慈,又稱正規(guī)表示式纳寂、正規(guī)表示法、正規(guī)表達式泻拦、規(guī)則表達式毙芜、常規(guī)表示法(英語:Regular Expression,在代碼中常簡寫為regex争拐、regexp或RE)腋粥,計算機科學的一個概念。正則表達式使用單個字符串來描述架曹、匹配一系列匹配某個句法規(guī)則的字符串灯抛。在很多文本編輯器里,正則表達式通常被用來檢索音瓷、替換那些匹配某個模式的文本对嚼。
許多程序設計語言都支持利用正則表達式進行字符串操作。例如绳慎,在Perl中就內建了一個功正則表達式則表達式引擎纵竖。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和gr正則表達式開的漠烧。正則表達式通常縮寫成“regex”靡砌,單數(shù)有regexp已脓、regex,復數(shù)有regexps通殃、regexes度液、regexen。
-----維基百科
上面一大段書面式刻板的簡介不知道大家有沒有耐心看完画舌,看到那么多專業(yè)且刻板的術語堕担,讀完還是不了解正則表達式到底是什么。其實上面的文字總結為一句話:正則表達式就是用于記錄文本規(guī)則的代碼曲聂。
舉例說明:在使用windows過程中霹购,我們經(jīng)常使用 ? 和 * 通配符來查找硬盤上的文件。? 通配符匹配文件名中的單個字符朋腋,而 * 通配符匹配零個或多個字符齐疙。
使用 data?.zip 這樣的模式將查找下列文件:>datas.zip
data1.zip
data2.zip
data3.zip
使用 * 字符代替 ? 字符擴大了找到的文件的數(shù)量。data*.dat 匹配下列所有文件:
datas.zip
dataSource.zip
dataArray.zip
dataDic.zip
這種搜索方式在使用電腦的日常生活中很有用旭咽,但是對于大多數(shù)的場景來說贞奋,它還是有限的。通過通配符的工作原理穷绵,引入正則表達式的概念忆矛。正則表達式和通配符類似,同樣用于文本匹配请垛,只不過跟通配符比較起來催训,正則表達式功能更加強大并且更加靈活,更加精確的描述你的需求宗收。
常用功能
不管是文檔編輯軟件或者是IDE中都提供了搜索和替換功能漫拭,這些功能基本可以滿足我們的一些基本操作,但是對于無法使用軟件的情況下混稽,我們想要從茫茫的數(shù)據(jù)中查找到與滿足自己需求的數(shù)據(jù)采驻,就又寫捉襟見肘。通過正則表達式可以滿足你的這些需求:
- 數(shù)據(jù)校驗
正如上面所總結的:正則表達式就是用于記錄文本規(guī)則的代碼匈勋。我們寫一段規(guī)則礼旅,通過特定的語法來查看目標字符串是否符合這個規(guī)則。例如:手機號校驗洽洁、郵箱地址校驗痘系、密碼(6-12位數(shù)字字母密碼)校驗等等 - 文本替換&文本提取首先通過正則表達式來識別某些特定文本,并對該特定文本執(zhí)行提取饿自、刪除或替換等操作汰翠。
語法
正則表達式是由兩種基本字符組成:普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符" --- metacharacter)所組成的描述文本規(guī)則的代碼龄坪。規(guī)則用來描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為文本規(guī)則复唤,將某個文本規(guī)則與所搜索的字符串進行匹配健田。
入門
學習正則表達式最好的方法就是從現(xiàn)有的例子開始,理解例子之后佛纫,在其基礎之上修改實驗妓局。在接下來的講解中,會結合簡單的例子來加深對正則表達式的理解呈宇。
元字符
元字符就是指那些在正則表達式中具有特殊意義的專用字符好爬,用來規(guī)定其前導字符(位于元字符前面的字符)在目標對象中的出現(xiàn)規(guī)則,一個元字符可以用來匹配一個或者多個字符攒盈。
總結:元字符就是正則表達式中用來描述一個文本規(guī)則的專用字符抵拘。
舉例:精確查找“ab”在未使用正則表達式之前哎榴,查找ab型豁,我們可能會得到以下結果
abc
cab
cabc
元字符:\b精確查找的ab字符的正則表達式為:\bab\b 。\b 代表文本的開頭或者結尾尚蝌,也就是文本的邊界迎变,上面的正則表達式表示的意思是 :以a開頭,以b結尾的文本規(guī)則飘言。并且\b 并不會匹配分隔字符(空格衣形、標點符號、換行符)中的任何一個姿鸿,只是單純的匹配一個位置谆吴。
元字符:.可以理解為匹配除換行符以外的任意字符**
元字符:* 代表的不是字符(因為正則表達式*是用于描述文本規(guī)則的一段代碼,代表規(guī)則苛预,不代表字符)句狼,也不是位置,而是數(shù)量----它指定前邊的內容可以連續(xù)重復使用任意次以使整個表達式得到匹配热某。
元字符:\d可以用于匹配一個數(shù)字(0-9)腻菇,舉例說明:0\d\d-\d\d\d\d\d\d\d\d 匹配這樣的字符串:以0開頭,然后是兩個數(shù)字昔馋,然后是一個連字號“-”筹吐,最后是8個數(shù)字(用來匹配中國的座機號,當然秘遏,這個例子只能匹配區(qū)號為3位的情形)丘薛。當然表達同樣的意思還有一個簡單的寫法:0\d{2}-\d{8} 這里\d后面的{2}和{8}的意思是前面\d必須連續(xù)重復匹配2次和8次。
綜合例子: \bCrab\b.*\bMan\b:用于匹配以Crab開頭邦危,中間跟著任意個數(shù)任意字符榔袋,然后以Man結尾的字符串
<div align = center> 表一:常用的元字符 </div>
元字符 | 說明 |
---|---|
. | 匹配除換行符以外的任意字符 |
\w | 匹配字母或數(shù)字或下劃線或漢字 |
\s | 任意的空白符周拐,包括空格,制表符(Tab)凰兑,換行符妥粟,中文全角空格等 |
\d | 匹配數(shù)字(0-9) |
\b | 匹配單詞的開始或結束 |
^ | 匹配字符串的開始 |
$ | 匹配字符串的結束 |
結合例子說明:
\ba\w\b匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然后是字母a,然后是任意數(shù)量的字母或數(shù)字(\w)吏够,最后是單詞結束處(\b)勾给。\d+** 匹配1個或更多連續(xù)的數(shù)字。這里的+是和*類似的元字符锅知,不同的是*匹配重復任意次(可能是0次)播急,而+則匹配重復1次或更多次。\b\w{6}\b 匹配剛好6個字符的單詞售睹。元字符 ^(和數(shù)字6在同一個鍵位上的符號)和 $ 都匹配一個位置桩警,這和\b有點類似。^匹配你要用來查找的字符串的開頭昌妹,$ 匹配結尾捶枢。這兩個代碼在驗證輸入的內容時非常有用,比如一個網(wǎng)站如果要求你填寫的QQ號必須為5位到12位數(shù)字時飞崖,可以使用:^\d{5,12}$烂叔。這里的 {5,12} 和前面介紹過的{2}是類似的,只不過{2}匹配只能不多不少重復2次固歪,{5,12} 則是重復的次數(shù)不能少于5次蒜鸡,不能多于12次,否則都不匹配牢裳。因為使用了 ^ 和 $逢防,所以輸入的整個字符串都要用來和 \d{5,12} 來匹配,也就是說整個輸入必須是5到12個數(shù)字蒲讯,因此如果輸入的QQ號能匹配這個正則表達式的話忘朝,那就符合要求了。
限定符
正則表達式中提供了有一類用于限定字符數(shù)量的符號伶椿,稱為 限定符辜伟。并且限定符分為兩種 :
- 貪婪的:嘗試盡可能多的匹配元素
- 惰性(非貪婪)的:盡可能的少的匹配元素
通過添加問號即 ?可以將貪婪限定符轉為惰性限定符脊另。
從前面的綜合例子中导狡,大概已經(jīng)知道了限定字符數(shù)量的字符 例如 :* ,+偎痛,{2}...
<div align = center> 表2 常用的限定符</div>
貪婪限定符 | 惰性限定符 | 說明 |
---|---|---|
* | *? | 重復零次或更多次 |
+ | *+ | 重復一次或更多次 |
? | ?? | 重復零次或一次 |
{n} | {n}? | 重復n次 |
{n,} | {n,}? | 重復n次或更多次 |
{n,m} | {n,m}? | 重復n到m次 |
關于貪婪限定符與惰性限定符之間的區(qū)別以及完整介紹旱捧,戳這里進一步了解
參考文檔:
《正則表達式30分鐘入門教程》
《正則表達式必知必會》
正則表達式在iOS中的應用
1.NSString的方法
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask{
NSString *searchText = @"rangeOfString";
NSRange range = [searchText rangeOfString:@"^[0-9]+$" options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
NSLog(@"range :%@", [searchText substringWithRange:range]);
}
2.NSPredicate
Cocoa框架中的NSPredicate用于查詢,原理和用法都類似于SQL中的where,作用相當于數(shù)據(jù)庫的過濾取枚赡。 我們可以編寫簡單的謂詞語句氓癌,就可以從數(shù)組中過濾出我們想要的數(shù)據(jù)。 代碼示例:
+ (BOOL)validateEmail:(NSString *)email{
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:email];
}
3.NSRegularExpression
NSRegularExpression這個類是蘋果專門封裝的一個用來處理正則表達式的類贫橙。
代碼示例:
objectivecNSString *searchText = @"you want to match";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+$" options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
if (result) {
NSLog(@"%@", [searchText substringWithRange:result.range]);
}
未完待續(xù)....