国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Regex > 正文

IOS開(kāi)發(fā)常用的正則表達(dá)式

2020-03-16 21:02:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

正則表達(dá)式是一種用來(lái)進(jìn)行文本匹配的工具,其語(yǔ)法非常精簡(jiǎn),這篇文章是小編日常整理了些有關(guān)ios開(kāi)發(fā)常用的正則表達(dá)式,非常具有借鑒價(jià)值,感興趣的朋友快來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

正則表達(dá)式是一種用來(lái)進(jìn)行文本匹配的工具,其語(yǔ)法優(yōu)美簡(jiǎn)潔。在開(kāi)發(fā)中,查找、對(duì)比以及匹配字符串是家常便飯的業(yè)務(wù),通過(guò)正則表達(dá)式我們將這些業(yè)務(wù)描述成某些需求規(guī)則,來(lái)讓我們的代碼更美觀、實(shí)用。例如我們要驗(yàn)證用戶(hù)輸入的密碼長(zhǎng)度是否滿(mǎn)足6~18位的長(zhǎng)度,新手最常見(jiàn)的驗(yàn)證方式是判斷輸入的密碼長(zhǎng)度

return (textField.text.length >= 6 && textField.text.leng <= 18);

盡管這種判斷方式?jīng)]有任何問(wèn)題,而上面的驗(yàn)證換做正則表達(dá)式的匹配字符就顯得短小精悍

^.{6,18}$

還有,大部分的固定電話(huà)都是0區(qū)號(hào)-八位數(shù)字的格式,那么正則表達(dá)式的匹配如下

^0//d{2}/-?//d{8}$

再比如,對(duì)于密碼強(qiáng)度的認(rèn)證。如今的密碼應(yīng)該包括一個(gè)或以上的大寫(xiě)字母以及小寫(xiě)字母,對(duì)此正則表達(dá)式的匹配是

(^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$)

表達(dá)式字符解析

如果是新手開(kāi)發(fā)者,那么很有可能不理解上面的正則表達(dá)式。那么我們先看第一個(gè)匹配條件,匹配6-18位的密碼長(zhǎng)度。根據(jù)題目的要求,就能夠輕易的判斷出{6,18}表示6-18位。其中,{n}匹配字符重復(fù)n次;{n,}匹配重復(fù)n次或更多次;{n,m}匹配重復(fù)n到m之間次數(shù)。

那么讀者對(duì)^、.和$三個(gè)符號(hào)可能不明所以。^和$屬于特殊符號(hào),前者表示匹配字符串的開(kāi)頭,后者表示匹配字符串的結(jié)尾。由于我們有時(shí)需要在一段很長(zhǎng)的字符串中匹配某些小片段字符串時(shí)(比如在圖文混編中匹配長(zhǎng)字符串中留空的表情符號(hào)),適當(dāng)使用這兩個(gè)符號(hào)可以減少匹配次數(shù),提高執(zhí)行效率。

那么結(jié)合這幾個(gè)字符代表含義,可以得出.符號(hào)表示任一字符(除換行符之外)。那么還可以得出{6,18}這個(gè)特殊符號(hào)表示的是前一個(gè)符號(hào)代表的位數(shù)。結(jié)合起來(lái)說(shuō)^.{6,18}$匹配一段6至18位長(zhǎng)度的字符串,所以可以用來(lái)驗(yàn)證密碼長(zhǎng)度

當(dāng)然了,.字符的匹配率太高,更多時(shí)候我們需要匹配的是具體到數(shù)字或者字母,甚至準(zhǔn)確的數(shù)字和字母。那么除了.字符以外,還有/d用來(lái)表示任意的單個(gè)數(shù)字,/w表示任意一個(gè)字母或數(shù)字或者直接使用0-9的任意數(shù)字表示具體數(shù)字。而特殊符號(hào)?表示前一個(gè)字符為0或者1個(gè)。

所以上面的^0//d{2}/-?//d{8}$匹配了以數(shù)字0開(kāi)頭,接著兩個(gè)數(shù)字,后面跟著-號(hào)跟八個(gè)數(shù)字,然后結(jié)尾的字符串,不管是010-88888888,還是02098989898都能進(jìn)行正確匹配。

最后的一個(gè)表達(dá)式可能是最復(fù)雜的表達(dá)式,根據(jù)上面對(duì)部分符號(hào)的解析。我們可以把

^.*[A-Z]+.*[a-z]+.*$|^.*[a-z]+.*[A-Z]+.*$

拆分成 ^.*[A-Z]+.*[a-z]+.*$ 跟 ^.*[a-z]+.*[A-Z]+.*$

這兩個(gè)單獨(dú)的表達(dá)式,而中間的|不難猜到就是邏輯的或。我們將對(duì)前一個(gè)進(jìn)行拆分,來(lái)一步步識(shí)別這個(gè)表達(dá)式的匹配規(guī)則。這里教大家我拆分表達(dá)式的方法:我把表達(dá)式的字符分為兩類(lèi):值表達(dá)和修飾表達(dá)。所謂值表達(dá)就是說(shuō)這個(gè)符號(hào)表示了某個(gè)值,就像/d表示數(shù)字,.表示任意非換行符字符。修飾表達(dá)用來(lái)修飾值達(dá)成某種條件,比如{2}表示前面一個(gè)值重復(fù)兩次,*表示前一個(gè)值重復(fù)0次或者更多次。根據(jù)這種方法,那么^.*[A-Z]+.*[a-z]+.*$可以拆分成部分:^$、 .* 、 [A-Z]+ 、 [a-z]+。

^$就不再多說(shuō)。

.*這里要介紹的就是*表示前一個(gè)值符號(hào)重復(fù)任意次數(shù)。

[A-Z]+中-表示從左邊的值到右邊的值之間所有值形成的閉集合;[]方括號(hào)表示的值必須是括號(hào)中間集合的子集,要注意的是括號(hào)里面可以有多個(gè)集合,比如[A-Z0-9a-z]表示匹配任意一個(gè)大小寫(xiě)字母或數(shù)字;+同*有點(diǎn)像,但是+表示的是至少一個(gè)的重復(fù)值。

結(jié)合上面的解析,那么^.*[A-Z]+.*[a-z]+.*$表示以任意數(shù)量的字符開(kāi)頭,然后跟著一個(gè)大寫(xiě)字母,大寫(xiě)字母后面有任意數(shù)量的字符以及一個(gè)小寫(xiě)字母,然后又是任意數(shù)量的數(shù)字、字母或者字符。而^.*[a-z]+.*[A-Z]+.*$表示小寫(xiě)字母在大寫(xiě)字母前面任意數(shù)量的字符的位置,兩個(gè)結(jié)合匹配可以確保字符串中包括至少一個(gè)小寫(xiě)字母和一個(gè)大寫(xiě)字母。

ps:有一點(diǎn)要注意,上面展示的表達(dá)式解析時(shí)/d這些特殊符號(hào)在我們的代碼中多了一個(gè)/,這是因?yàn)?本身是轉(zhuǎn)義符號(hào),為了保證表達(dá)式能正常匹配,我們要給/進(jìn)行一次轉(zhuǎn)義,所以就變成了//。基本上所有的符號(hào)字符都需要轉(zhuǎn)義。

語(yǔ)法/字符說(shuō)明表

值表達(dá)

. 匹配除換行符外的任意字符

/w 匹配字母或者數(shù)字的字符

/W 匹配任意不是字母或數(shù)字的字符

/s 匹配任意的空白符(空格、制表符、換行符)

/S 匹配任意不是空白符的字符

/d 匹配任意數(shù)字

/D 匹配任意非數(shù)字的字符

/b 匹配單詞的結(jié)尾或者開(kāi)頭的字符

/B 匹配任意不是單詞結(jié)尾或開(kāi)頭的字符

[^x] 匹配任意非x的字符。如[^[a-z]]匹配非小寫(xiě)字母的任意字符

^ 匹配字符串的開(kāi)頭

$ 匹配字符串的結(jié)尾

修飾表達(dá)

* 匹配重復(fù)任意次數(shù)

+ 匹配重復(fù)一次以上的次數(shù)

? 匹配一次或零次

{n} 匹配重復(fù)n次

{n,} 匹配重復(fù)n次或n次以上

{n,m} 匹配重復(fù)最少n次最多m次

除了上面列出的字符外,還有包括表示位置指定等較難運(yùn)用的其他正則表達(dá)式,但上面的字符已經(jīng)足夠我們正常使用了。想了解更多知識(shí)可以度娘Google。

代碼實(shí)操

上面我們只是簡(jiǎn)單的講解了正則表達(dá)式中各個(gè)字符代表的意義,那么在iOS開(kāi)發(fā)中應(yīng)該怎么使用。對(duì)于有意使用正則規(guī)則來(lái)匹配的開(kāi)發(fā)者,我的建議是封裝成為類(lèi)別方法,一次封裝,多次調(diào)用。下面用我自己封裝的代碼進(jìn)行說(shuō)明。這些方法通過(guò)擴(kuò)展UITextField方法來(lái)實(shí)現(xiàn):

@interface UITextField (LXDValidate)

/*! 判斷文本框是否為空(非正則表達(dá)式)*/

- (BOOL)isEmpty;

/*! 判斷郵箱是否正確*/

- (BOOL)validateEmail;

/*! 判斷驗(yàn)證碼是否正確*/

- (BOOL)validateAuthen;

/*! 判斷密碼格式是否正確*/

- (BOOL)validatePassword;

/*! 判斷手機(jī)號(hào)碼是否正確*/

- (BOOL)validatePhoneNumber;

/*! 自己寫(xiě)正則傳入進(jìn)行判斷*/

- (BOOL)validateWithRegExp: (NSString *)regExp;

@end

方法實(shí)現(xiàn)文件:

 

 
  1. #import "UITextField+LXDValidate.h" 
  2. @implementation UITextField (LXDValidate) 
  3. - (BOOL)isEmpty 
  4. return self.text.length == ; 
  5. - (BOOL)validateEmail 
  6. return [self validateWithRegExp: @"^[a-zA-Z-]{,}@[a-z-A-Z]{,}//.[a-zA-Z]{,}$"]; 
  7. - (BOOL)validateAuthen 
  8. return [self validateWithRegExp: @"^//d{,}$"]; 
  9. - (BOOL)validatePassword 
  10. NSString * length = @"^//w{,}$"//長(zhǎng)度 
  11. NSString * number = @"^//w*//d+//w*$"//數(shù)字 
  12. NSString * lower = @"^//w*[a-z]+//w*$"//小寫(xiě)字母 
  13. NSString * upper = @"^//w*[A-Z]+//w*$"//大寫(xiě)字母 
  14. return [self validateWithRegExp: length] && [self validateWithRegExp: number] && [self validateWithRegExp: lower] && [self validateWithRegExp: upper]; 
  15. - (BOOL)validatePhoneNumber 
  16. NSString * reg = @"^//d{}$"
  17. return [self validateWithRegExp: reg]; 
  18. - (BOOL)validateWithRegExp: (NSString *)regExp 
  19. NSPredicate * predicate = [NSPredicate predicateWithFormat: @"SELF MATCHES %@", regExp]; 
  20. return [predicate evaluateWithObject: self.text]; 
  21. @end 

以上內(nèi)容是小編給大家介紹的有關(guān)IOS開(kāi)發(fā)常用的正則表達(dá)式,希望大家喜歡。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 辽阳县| 新乡市| 夹江县| 天柱县| 万年县| 安徽省| 峨山| 杨浦区| 池州市| 长乐市| 昌邑市| 循化| 平果县| 清徐县| 高尔夫| 泰来县| 鹤岗市| 泾源县| 鄂托克旗| 金湖县| 油尖旺区| 简阳市| 汶上县| 滦南县| 蓬溪县| 沈丘县| 军事| 元阳县| 苏尼特右旗| 平遥县| 谷城县| 集贤县| 霍林郭勒市| 安岳县| 阳山县| 隆回县| 外汇| 长海县| 个旧市| 霞浦县| 临沧市|