以前遇到判斷UITextField里面的字符串的是否為數(shù)字形式耕蝉,就是傻乎乎的去判斷里面的內(nèi)容铐刘。操作如下:
//判斷是否 為數(shù)字
if ([self isPureInt:self.lengthTF.text] || [self isPureFloat:self.lengthTF.text]) {
//要么是整數(shù)歧杏,要么是浮點(diǎn)數(shù)
[self setShowInfomaton];
}else{
[SVProgressHUD showErrorWithStatus:NSLocaString(@"請(qǐng)輸入數(shù)字格式")];
}
//判斷是否為整型
- (BOOL)isPureInt:(NSString*)string{
NSScanner* scan = [NSScanner scannerWithString:string];
int val;
return [scan scanInt:&val] && [scan isAtEnd];
}
//判斷是否為浮點(diǎn)形
- (BOOL)isPureFloat:(NSString*)string{
NSScanner* scan = [NSScanner scannerWithString:string];
float val;
return[scan scanFloat:&val] && [scan isAtEnd];
}
而使用正則表達(dá)式镰惦,則操作就簡(jiǎn)便了些。如下:
//驗(yàn)證 數(shù)字
static NSString * const Regex_Number = @"^((^0\\.\\d{0,2}$)|(^[1-9]+\\d*\\.\\d{0,2}$)|(^[1-9]\\d*$)|(^0$))?$";
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",Regex_Number];
if ([predicate evaluateWithObject:self.lengthTF.text]) {
[self setShowInfomaton];
}else{
[SVProgressHUD showErrorWithStatus:NSLocaString(@"請(qǐng)輸入數(shù)字格式")];
}
當(dāng)然支持判斷犬绒、驗(yàn)證的類型 還很多旺入!
正則表達(dá)式
是對(duì)字符串操作的一種邏輯公式。正則表達(dá)式可以檢測(cè)給定的字符串是否符合我們定義的邏輯凯力,也可以從字符串中獲取我們想要的特定部分茵瘾。
-
看一個(gè)過(guò)濾(判斷是否為)純整數(shù)數(shù)字的例子
- (BOOL)validateNumber:(NSString *)textString { NSString* numberStr = @"^[0-9]+$"; NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",numberStr]; return [numberPre evaluateWithObject:textString]; }
NSString * compStr = @"iphone7"; BOOL isTotallyNumber = [self validateNumber:compStr]; NSLog(@"%d",isTotallyNumber); // 輸出BOOL值的方法 NSLog(@"%@",isTotallyNumber?@"YES":@"NO");
NSString * compStr = @"01234447"; BOOL isTotallyNumber = [self validateNumber:compStr]; NSLog(@"%d",isTotallyNumber); // 輸出BOOL值的方法 NSLog(@"%@",isTotallyNumber?@"YES":@"NO");
其中@"^[0-9]+$"就是一個(gè)正則表達(dá)式,它代表了字符串中只能包含“>=1”個(gè)“0-9”的數(shù)字急膀。
語(yǔ)法:
首先,特殊符號(hào)’^'和’$'龄捡。他們的作用是分別指出一個(gè)字符串的開(kāi)始和結(jié)束卓嫂。
“^one”:表示所有以”one”開(kāi)始的字符串(”one cat”,”one123″聘殖,·····)晨雳;
類似于:- (BOOL)hasPrefix:(NSString *)aString;
“a dog$”:表示所以以”a dog”結(jié)尾的字符串(”it is a dog”,·····)奸腺;
類似于:- (BOOL)hasSuffix:(NSString *)aString;
“^apple$”:表示開(kāi)始和結(jié)尾都是”apple”的字符串餐禁,這個(gè)是唯一的~;
“banana”:表示任何包含”banana”的字符串突照。
類似于 iOS8的新方法:- (BOOL)containsString:(NSString *)aString,搜索子串用的帮非。
再者
‘*’,’+'和’?’這三個(gè)符號(hào)讹蘑,表示一個(gè)或N個(gè)字符重復(fù)出現(xiàn)的次數(shù)末盔。它們分別表示“沒(méi)有或更多”([0,+∞]取整),“一次或更多”([1,+∞]取整)座慰,“沒(méi)有或一次”([0,1]取整)陨舱。
下面是幾個(gè)例子:
“ab*”:表示一個(gè)字符串有一個(gè)a后面跟著零個(gè)或若干個(gè)b(”a”, “ab”, “abbb”,……);
“ab+”:表示一個(gè)字符串有一個(gè)a后面跟著至少一個(gè)b或者更多( “ab”, “abbb”,……)版仔;
“ab?”:表示一個(gè)字符串有一個(gè)a后面跟著零個(gè)或者一個(gè)b( “a”, “ab”)游盲;
“a?b+$”:表示在字符串的末尾有* 零個(gè)或一個(gè)a* 跟著 * 一個(gè)或幾個(gè)b* ( “b”, “ab”,“bb”,“abb”,……)。
其中可以用 大括號(hào) 括起來(lái)( { } )蛮粮,表示一個(gè)重復(fù)的具體范圍益缎。
例如:
“ab{4}”:表示一個(gè)字符串有一個(gè)a跟著4個(gè)b(“abbbb”);
“ab{1,}”:表示一個(gè)字符串有一個(gè)a跟著至少1個(gè)b(“ab”,“abb”,“abbb”,……)然想;
“ab{3,4}”:表示一個(gè)字符串有一個(gè)a跟著3到4個(gè)b(“abbb”,“abbbb”)莺奔。
那么,“** * ”可以用{0又沾,}表示弊仪,“+”可以用{1熙卡,}表示杖刷,“?”可以用{0,1}**表示驳癌。
??注意??:可以沒(méi)有下限滑燃,但是不能沒(méi)有上限!例如“ab{,5}”是錯(cuò)誤的寫(xiě)法颓鲜。
“ | ”表示“或”操作:
“a|b”:表示一個(gè)字符串里有”a”或者”b”表窘;
“(a|bcd)ef”:表示“aef”或“bcdef”典予;
“(a|b)*c”:表示一串“a”、“b”混合的字符串后面跟一個(gè)“c”乐严;
方括號(hào)”[ ]“表示在括號(hào)內(nèi)的眾多字符中瘤袖,選擇1 - N個(gè)括號(hào)內(nèi)的符合語(yǔ)法的字符作為結(jié)果。
例如:
“[ab]”:表示一個(gè)字符串有一個(gè)”a”或”b”(相當(dāng)于”a|b”)昂验;
“[a-d]”:表示一個(gè)字符串包含小寫(xiě)的'a'到'd'中的一個(gè)(相當(dāng)于”a|b|c|d”或者”[abcd]“)捂敌;
“^[a-zA-Z]”:表示一個(gè)以字母開(kāi)頭的字符串;
“[0-9]a”:表示a前有一位的數(shù)字既琴;
“[a-zA-Z0-9]$”:表示一個(gè)字符串以一個(gè)字母或數(shù)字結(jié)束占婉。
“.”匹配除“\r\n”之外的任何單個(gè)字符:
“a.[a-z]”:表示一個(gè)字符串有一個(gè)”a”后面跟著一個(gè)任意字符和一個(gè)小寫(xiě)字母;
“^.{5}$”:表示任意1個(gè)長(zhǎng)度為5的字符串甫恩;
“\num” 其中num是一個(gè)正整數(shù)逆济。表示”\num”之前的字符出現(xiàn)相同的個(gè)數(shù)。例如:
“(.)\1”:表示兩個(gè)連續(xù)的相同字符磺箕。
“10{1,2}” : 表示數(shù)字1后面跟著1或者2個(gè)0 (“10″,”100″)奖慌。
“ 0{3,} ” 表示數(shù)字為至少3個(gè)連續(xù)的0 (“000”,“0000”松靡,······)升薯。
在方括號(hào)里用‘^’表示不希望出現(xiàn)的字符,‘^’應(yīng)在方括號(hào)里的第一位击困。
“@[^a-zA-Z]4@”表示兩個(gè)”@”中不應(yīng)該出現(xiàn)字母)涎劈。
常用的還有:
“ \d ”匹配一個(gè)數(shù)字字符。等價(jià)于[0-9]阅茶。
“ \D”匹配一個(gè)非數(shù)字字符蛛枚。等價(jià)于[^0-9]。
“ \w ”匹配包括下劃線的任何單詞字符脸哀。等價(jià)于“[A-Za-z0-9_]”蹦浦。
“ \W ”匹配任何非單詞字符。等價(jià)于“[^A-Za-z0-9_]”撞蜂。
iOS中書(shū)寫(xiě)正則表達(dá)式盲镶,碰到轉(zhuǎn)義字符,多加一個(gè)“\”,例如:
全數(shù)字字符:@”^\d+$”
iOS中正則表達(dá)式
[1].正則表達(dá)式與NSPredicate(謂詞類)連用蝌诡。
//將正則表達(dá)式定義為 靜態(tài)字符串
//手機(jī)號(hào)
static NSString * const Regex_PhoneNum = @"^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$";
//郵箱
static NSString * const Regex_Email = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
//身份證號(hào)
static NSString * const Regex_IDCardNumber = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
//數(shù)字
static NSString * const Regex_Number = @"^((^0\\.\\d{0,2}$)|(^[1-9]+\\d*\\.\\d{0,2}$)|(^[1-9]\\d*$)|(^0$))?$";
//車牌號(hào)
static NSString * const Regex_CarNumber = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$";
//車型
static NSString * const Regex_CarType = @"^[\u4E00-\u9FFF]+$";
//用戶名
static NSString * const Regex_UserName = @"^[A-Za-z0-9]{6,20}+$";
//密碼
static NSString * const Regex_Code = @"^[a-zA-Z0-9]{6,20}+$";
//昵稱
static NSString * const Regex_nickName = @"^[\u4e00-\u9fa5]{4,8}$";
為了簡(jiǎn)便演示溉贿,就直接使用main.storyboard拖控件了。
- (void)viewDidLoad {
[super viewDidLoad];
// 放入全局?jǐn)?shù)組中
_predicateArr = @[Regex_PhoneNum,Regex_Email,Regex_IDCardNumber,Regex_Number,Regex_CarNumber,Regex_CarNumber,Regex_CarType,Regex_UserName,Regex_Code,Regex_nickName];
}
- (IBAction)buttonTouch:(UIButton *)sender {
// 謂詞NSPredicate
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",_predicateArr[0]];
if ([predicate evaluateWithObject:self.inputTF.text]) {
NSLog(@"這是個(gè)手機(jī)號(hào)");
self.textLB.text = @"這是個(gè)手機(jī)號(hào)";
}else{
NSLog(@"不是手機(jī)號(hào)");
self.textLB.text = @"不是手機(jī)號(hào)";
}
//根據(jù)自己需要浦旱,更換 數(shù)組中對(duì)應(yīng)的正則表達(dá)式 進(jìn)行判斷操作 就好了
// NSPredicate * predicate1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",_predicateArr[1]]; //謂詞
// if ([predicate1 evaluateWithObject:self.inputTF.text]) {
// NSLog(@"這是個(gè)Email");
// self.textLB.text = @"這是個(gè)Email";
// return;
// }else{
// NSLog(@"不是Email");
// self.textLB.text = @"不是Email";
// }
// NSPredicate * predicate2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",_predicateArr[2]]; //謂詞
// if ([predicate2 evaluateWithObject:self.inputTF.text]) {
// NSLog(@"這是身份證號(hào)");
// self.textLB.text = @"這是身份證號(hào)";
// }else{
// NSLog(@"不是身份證號(hào)");
// self.textLB.text = @"不是身份證號(hào)";
// }
//
// NSPredicate * predicate3 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",_predicateArr[3]]; //謂詞
// if ([predicate3 evaluateWithObject:self.inputTF.text]) {
// NSLog(@"這是個(gè)數(shù)字");
// self.textLB.text = @"這是個(gè)數(shù)字";
// }else{
// NSLog(@"不是數(shù)字");
// self.textLB.text = @"不是數(shù)字";
// }
//
//
// NSPredicate * predicate4 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",_predicateArr[4]]; //謂詞
// if ([predicate4 evaluateWithObject:self.inputTF.text]) {
// NSLog(@"這是車牌號(hào)");
// self.textLB.text = @"這是車牌號(hào)";
// }else{
// NSLog(@"不是車牌號(hào)");
// self.textLB.text = @"不是車牌號(hào)";
// }
//
// NSPredicate * predicate5 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",_predicateArr[5]]; //謂詞
// if ([predicate5 evaluateWithObject:self.inputTF.text]) {
// NSLog(@"這是車型");
// self.textLB.text = @"這是車型";
// }else{
// NSLog(@"不是車型");
// self.textLB.text = @"不是車型";
// }
//
// NSPredicate * predicate6 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",_predicateArr[6]]; //謂詞
// if ([predicate6 evaluateWithObject:self.inputTF.text]) {
// NSLog(@"這是用戶名");
// self.textLB.text = @"這是用戶名";
// }else{
// NSLog(@"不是用戶名");
// self.textLB.text = @"不是用戶名";
// }
//
// NSPredicate * predicate7 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",_predicateArr[7]]; //謂詞
// if ([predicate7 evaluateWithObject:self.inputTF.text]) {
// NSLog(@"這是密碼");
// self.textLB.text = @"這是密碼";
// }else{
// NSLog(@"不是密碼");
// self.textLB.text = @"不是密碼";
// }
//
// NSPredicate * predicate8 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",_predicateArr[8]]; //謂詞
// if ([predicate8 evaluateWithObject:self.inputTF.text]) {
// NSLog(@"這是昵稱");
// self.textLB.text = @"這是昵稱";
// }else{
// NSLog(@"不是昵稱");
// self.textLB.text = @"不是昵稱";
// }
}
使用正則表達(dá)式 不會(huì)像之前用字符串判斷“是否為數(shù)字?”時(shí)宇色,可能會(huì)忽略數(shù)值為小數(shù)的情況。正則表達(dá)式 可以保證 格式 完全正確!P洹例隆!
?我們只需要在需要判斷的地方進(jìn)行相應(yīng)處理就好了。
[2].使用NSString方法
“[ rangeOfString: options: ];”方法 會(huì)返回一個(gè)NSRange抢蚀,用來(lái)接收 匹配的范圍镀层。
如果匹配不到結(jié)果,則返回一個(gè)NSIntegerMax(最大值)皿曲,即:NSNotFound鹿响。
#define NSIntegerMax LONG_MAX // 有符號(hào)長(zhǎng)整形最大值
因此可以用來(lái)判斷用戶輸入的內(nèi)容是否符合規(guī)則。
NSString *searchText = @"rangeOfString62323";
NSRange range = [searchText rangeOfString:@"^[0-9]+$" options:NSRegularExpressionSearch];
// "^[0-9]+$" : 表示字符串中 只能包含至少1個(gè) 0-9的數(shù)字
if (range.location != NSNotFound) {
NSLog(@"range :%@", [searchText substringWithRange:range]);
NSLog(@"位置:%lu 長(zhǎng)度:%lu",(unsigned long)range.location,range.length);
}
效果:“range.location”值 是 最大值谷饿,不滿足if語(yǔ)句的條件惶我,不進(jìn)入判斷語(yǔ)句!
NSString *searchText = @"rangeOfString62323";
NSString *searchText = @"13112345678";
[3].正則表達(dá)式類(NSRegularExpression)
【3.1】獲取單條字符串
//用正則表達(dá)式截取字符串
NSString * compStr = @"http://www.reibang.com/users/0c0805f8de58/latest_articles";
NSError * error;
// 創(chuàng)建NSRegularExpression對(duì)象,并為其指定正則表達(dá)式
NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:@"[^an]*\\m" options:0 error:&error];
//@"[^X1 起始位置[不包含])]*\\X2 結(jié)束位置[包含])"
if (!error) {
// 獲取 特定字符串的范圍
NSTextCheckingResult * match = [regex firstMatchInString:compStr options:0 range:NSMakeRange(0, [compStr length])];
if (match) { //能匹配上
// 截獲特定的字符串
NSString * result = [compStr substringWithRange:match.range];
NSLog(@"%@",result);//結(jié)果:“shu.com”
}
} else {
// 如果有錯(cuò)誤博投,打印錯(cuò)誤
NSLog(@"error - %@", error);
}
控制臺(tái)打印結(jié)果:
從字符串里面檢索出的是以“an”開(kāi)頭“m”結(jié)尾的區(qū)間字符串绸贡,并且最終檢索出來(lái)的字符串的結(jié)尾包括了“m”,故而最終輸出結(jié)果為“shu.com”毅哗。
【3.2】獲取多條字符串
當(dāng)一個(gè)字符串里面有多個(gè)符合特定規(guī)則的字符時(shí)听怕,我們可分別獲取到符合特定規(guī)則的字符:
NSString * regex = @"\\_\\d*\\.";
//已“_”開(kāi)頭,“.”結(jié)尾 (都包含) 且取整數(shù)部分
NSString * compStr = @"_233423._dsakl3223.122_2abcl23.dfd_3242.34.322_";
NSError * error;
NSRegularExpression * regularEx = [NSRegularExpression regularExpressionWithPattern:regex options:NSRegularExpressionCaseInsensitive error:&error];
// 對(duì)compStr字符串進(jìn)行匹配
NSArray * matchStr_Arr = [regularEx matchesInString:compStr options:0 range:NSMakeRange(0, compStr.length)];
// 遍歷匹配到的每一條記錄
for (NSTextCheckingResult * match in matchStr_Arr) {
NSRange range = [match range];
NSString * elementStr = [compStr substringWithRange:range];
NSLog(@"%@", elementStr);
}
從指定字符串中獲取以“-”開(kāi)頭以“.”結(jié)尾的整型字符虑绵,由于它可能含有多個(gè)符合其規(guī)則的字符串尿瞭。故而需要把它們遍歷出來(lái)。
正則表達(dá)式 大匯總
以下正則表達(dá)式來(lái)自 百度百科:
1.驗(yàn)證用戶名和密碼:”^[a-zA-Z]\w{5,15}$”
2.驗(yàn)證電話號(hào)碼:(”^(\\d{3,4}-)\\d{7,8}$”)
eg:021-68686868 0511-6868686翅睛;
3.驗(yàn)證手機(jī)號(hào)碼:”^1[3|4|5|7|8][0-9]\\d{8}$”声搁;
4.驗(yàn)證身份證號(hào)(15位或18位數(shù)字):”\\d{14}[[0-9],0-9xX]”;
5.驗(yàn)證Email地址:(“^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\.\\w+([-.]\\w+)*$”)捕发;
6.只能輸入由數(shù)字和26個(gè)英文字母組成的字符串:(“^[A-Za-z0-9]+$”) ;
7.整數(shù)或者小數(shù):^[0-9]+([.]{0,1}[0-9]+){0,1}$
8.只能輸入數(shù)字:”^[0-9]*$”疏旨。
9.只能輸入n位的數(shù)字:”^\\d{n}$”。
10.只能輸入至少n位的數(shù)字:”^\\d{n,}$”扎酷。
11.只能輸入m~n位的數(shù)字:”^\\d{m,n}$”檐涝。
12.只能輸入零和非零開(kāi)頭的數(shù)字:”^(0|[1-9][0-9]*)$”。
13.只能輸入有兩位小數(shù)的正實(shí)數(shù):”^[0-9]+(.[0-9]{2})?$”法挨。
14.只能輸入有1~3位小數(shù)的正實(shí)數(shù):”^[0-9]+(\.[0-9]{1,3})?$”谁榜。
15.只能輸入非零的正整數(shù):”^\+?[1-9][0-9]*$”。
16.只能輸入非零的負(fù)整數(shù):”^\-[1-9][]0-9″*$凡纳。
17.只能輸入長(zhǎng)度為3的字符:”^.{3}$”窃植。
18.只能輸入由26個(gè)英文字母組成的字符串:”^[A-Za-z]+$”。
19.只能輸入由26個(gè)大寫(xiě)英文字母組成的字符串:”^[A-Z]+$”惫企。
20.只能輸入由26個(gè)小寫(xiě)英文字母組成的字符串:”^[a-z]+$”撕瞧。
21.驗(yàn)證是否含有^%&’,;=?$\”等字符:”[^%&',;=?$\x22]+”。
22.只能輸入漢字:”^[\u4e00-\u9fa5]{0,}$”狞尔。
23.驗(yàn)證URL:”^http://([\\w-]+\.)+[\\w-]+(/[\\w-./?%&=]*)?$”丛版。
24.驗(yàn)證一年的12個(gè)月:”^(0?[1-9]|1[0-2])$”正確格式為:”01″~”09″和”10″~”12″。
25.驗(yàn)證一個(gè)月的31天:”^((0?[1-9])|((1|2)[0-9])|30|31)$”正確格式為偏序;”01″~”09″页畦、”10″~”29″和“30”~“31”。
26.獲取日期正則表達(dá)式:\\d{4}[年|\-|\.]\\d{\1-\12}[月|\-|\.]\\d{\1-\31}日?
評(píng)注:可用來(lái)匹配大多數(shù)年月日信息研儒。
27.匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]
評(píng)注:可以用來(lái)計(jì)算字符串的長(zhǎng)度(一個(gè)雙字節(jié)字符長(zhǎng)度計(jì)2豫缨,ASCII字符計(jì)1)
28.匹配空白行的正則表達(dá)式:\n\s*\r
評(píng)注:可以用來(lái)刪除空白行
29.匹配HTML標(biāo)記的正則表達(dá)式:<(\S*?)[^>]*>.*?</>|<.*? />
評(píng)注:網(wǎng)上流傳的版本太糟糕,上面這個(gè)也僅僅能匹配部分端朵,對(duì)于復(fù)雜的嵌套標(biāo)記依舊無(wú)能為力
30.匹配首尾空白字符的正則表達(dá)式:^\s*|\s*$
評(píng)注:可以用來(lái)刪除行首行尾的空白字符(包括空格好芭、制表符、換頁(yè)符等等)冲呢,非常有用的表達(dá)式
31.匹配網(wǎng)址URL的正則表達(dá)式:[a-zA-z]+://[^\s]*
評(píng)注:網(wǎng)上流傳的版本功能很有限舍败,上面這個(gè)基本可以滿足需求
32.匹配帳號(hào)是否合法(字母開(kāi)頭,允許5-16字節(jié)敬拓,允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評(píng)注:表單驗(yàn)證時(shí)很實(shí)用
33.匹配騰訊QQ號(hào):[1-9][0-9]\{4,\}
評(píng)注:騰訊QQ號(hào)從10 000 開(kāi)始
34.匹配中國(guó)郵政編碼:[1-9]\\d{5}(?!\d)
評(píng)注:中國(guó)郵政編碼為6位數(shù)字
35.匹配ip地址:((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)邻薯。
大部分內(nèi)容都是自己使用過(guò)的,還有些使用乘凸,就不一一詳述了~~~~
如有紕漏厕诡,敬請(qǐng)指出!