iOS開發(fā)——正則表達(dá)式驗(yàn)證手機(jī)號逞盆、密碼

App的實(shí)際應(yīng)用中檀蹋,用戶登陸功能基本是每個App都有需求的一個功能。而當(dāng)前我們很常規(guī)的做法云芦,就是讓用戶把手機(jī)號作為自己的用戶名俯逾,而在注冊獲取短信驗(yàn)證碼的過程中,我們首先要完成的一個步驟舅逸,就是校驗(yàn)用戶的手機(jī)號是否是符合規(guī)則的手機(jī)號桌肴,而這種問題,一般稱之為字符串匹配問題琉历。

當(dāng)遇到字符串匹配問題時坠七,有一種常用的解決方法就是正則表達(dá)式。通過iOS中的NSRegularExpression這個類就可以幫助我們實(shí)現(xiàn)這個旗笔。

下面先來介紹一下正則表達(dá)式的基本語法灼捂。

正則表達(dá)式基本語法

正則表達(dá)式常見字符

    test            # 匹配包含test的字符串
    .               # 匹配除換行符外任意字符
    \               # 轉(zhuǎn)義字符
    [abc]或[a-c]    # 匹配字符類,如例子匹配a,b,c中的任何一個
    [^abc]          # 匹配除了a,b,c以外的所有字符

正則表達(dá)式特殊字符

\d                  # 數(shù)字换团,等同于[0-9]
\D                  # 非數(shù)字
\s                  # 空白字符(包括換行、Tab等)
\S                  # 非空白字符
\w                  # 單詞宫蛆,等用于[a-zA-Z0-9_]
\W                  # 非單詞

正則表達(dá)式數(shù)量詞

c*                  # 匹配字符"c" 0或無限次
c+                  # 匹配字符"c" 1次以上
c?                  # 匹配字符"c" 0或1次
c{3}                # 匹配字符"c" 3次
c{3,5}              # 匹配字符"c" 3到5次

正則表達(dá)式邊界匹配

^abc                # 匹配"abc"開頭的字符串
abc$                # 匹配"abc"結(jié)尾的字符串

正則表達(dá)式邏輯或分組

c|b                 # 匹配"c"或"b"
(ab|cd)             # 匹配"ab"或"cd"
(?P<name>abc)       # 匹配"abc"并命名為name
(?P=name)           # 前文中的name組

實(shí)例分析 匹配用戶手機(jī)號

根據(jù)上面的語法艘包,我用OC語言寫出來的正則表達(dá)式匹配手機(jī)號的代碼如下:

NSString *pattern = @"^1+[3578]+\\d{9}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:telNumber];
return isMatch; 

我們來分析我寫的這段正則表達(dá)式,首先是邊界匹配^1手機(jī)號一定是1開頭耀盗,所以我們的開頭用邊界匹配1想虎。

[3578] 我們用中括號[]來匹配字符類,說明第二位數(shù)字是3叛拷、5舌厨、7、8中任意一個就可以忿薇,目前17也是新開號段裙椭,所以得考慮進(jìn)去匹配上躏哩。

最后\\d{9}這里要拆分開看,首先\d表示數(shù)字揉燃,等同于[0-9],而{9}表示匹配數(shù)字\d 9次扫尺。這樣,就完成了一個11位手機(jī)號碼的校驗(yàn)炊汤。

封裝常用的正則表達(dá)式方法

在這里正驻,我把常用的正則表達(dá)式的匹配方法,封裝起來抢腐,項(xiàng)目中基本都會用到

  • 以下是.h頭文件中的聲明
#pragma 正則匹配手機(jī)號
+ (BOOL)checkTelNumber:(NSString *) telNumber;
#pragma 正則匹配用戶密碼6-18位數(shù)字和字母組合
+ (BOOL)checkPassword:(NSString *) password;
#pragma 正則匹配用戶姓名,20位的中文或英文
+ (BOOL)checkUserName : (NSString *) userName;
#pragma 正則匹配用戶身份證號
+ (BOOL)checkUserIdCard: (NSString *) idCard;
#pragma 正則匹配URL
+ (BOOL)checkURL : (NSString *) url;

  • 以下是.m文件中的具體實(shí)現(xiàn),直接復(fù)制到自己的項(xiàng)目中即可用
#pragma 正則匹配手機(jī)號
+ (BOOL)checkTelNumber:(NSString *) telNumber
{
    NSString *pattern = @"^1+[3578]+\\d{9}";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:telNumber];
    return isMatch;
}


#pragma 正則匹配用戶密碼6-18位數(shù)字和字母組合
+ (BOOL)checkPassword:(NSString *) password
{
    NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:password];
    return isMatch;
    
}

#pragma 正則匹配用戶姓名,20位的中文或英文
+ (BOOL)checkUserName : (NSString *) userName
{
    NSString *pattern = @"^[a-zA-Z\u4E00-\u9FA5]{1,20}";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:userName];
    return isMatch;
    
}


#pragma 正則匹配用戶身份證號15或18位
+ (BOOL)checkUserIdCard: (NSString *) idCard
{
    NSString *pattern = @"(^[0-9]{15}$)|([0-9]{17}([0-9]|X)$)";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:idCard];
    return isMatch;
}

#pragma 正則匹員工號,12位的數(shù)字
+ (BOOL)checkEmployeeNumber : (NSString *) number
{
    NSString *pattern = @"^[0-9]{12}";
    
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:number];
    return isMatch;
    
}

#pragma 正則匹配URL
+ (BOOL)checkURL : (NSString *) url
{
    NSString *pattern = @"^[0-9A-Za-z]{1,50}";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:url];
    return isMatch;
}

今天的正則表達(dá)式就分析到這里姑曙,正則表達(dá)式的關(guān)鍵點(diǎn),還是根據(jù)語法來自己判斷迈倍,實(shí)在不行伤靠,就敲敲代碼實(shí)踐咯~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市授瘦,隨后出現(xiàn)的幾起案子醋界,更是在濱河造成了極大的恐慌,老刑警劉巖提完,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件形纺,死亡現(xiàn)場離奇詭異,居然都是意外死亡徒欣,警方通過查閱死者的電腦和手機(jī)逐样,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來打肝,“玉大人脂新,你說我怎么就攤上這事〈炙螅” “怎么了争便?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長断医。 經(jīng)常有香客問我滞乙,道長,這世上最難降的妖魔是什么鉴嗤? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任斩启,我火速辦了婚禮,結(jié)果婚禮上醉锅,老公的妹妹穿的比我還像新娘兔簇。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布垄琐。 她就那樣靜靜地躺著边酒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪此虑。 梳的紋絲不亂的頭發(fā)上甚纲,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音朦前,去河邊找鬼介杆。 笑死,一個胖子當(dāng)著我的面吹牛韭寸,可吹牛的內(nèi)容都是我干的春哨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼恩伺,長吁一口氣:“原來是場噩夢啊……” “哼赴背!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晶渠,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤凰荚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后褒脯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體便瑟,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年番川,在試婚紗的時候發(fā)現(xiàn)自己被綠了到涂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡颁督,死狀恐怖践啄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沉御,我是刑警寧澤屿讽,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站吠裆,受9級特大地震影響伐谈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜硫痰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窜护。 院中可真熱鬧效斑,春花似錦、人聲如沸柱徙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敌完,卻和暖如春储耐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滨溉。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工什湘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晦攒。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓闽撤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脯颜。 傳聞我的和親對象是個殘疾皇子哟旗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容