OC 正規表示式的語法及使用
正規表示式就是可以分段進行匹配的語法規則,判斷字串中的每一個片段是否能夠相應的內容規則匹配。
基本語法:
1.一般字元,除了元字元外的字元都是一般字元,匹配的就是字元的字面意思。
2.元字元,特殊字元,不是匹配的字元字面量。
. 表示除換行符以外的任意字元;
* 表示它前面的那個表示式重複0次或若干次;
eg:“ab*”表示“a”或“ab”或“abb”…
+ 表示它前面的那個表示式重複至少1次;
eg:“ab+”表示“ab”或“abb”或“abbb”…
? 表示它前面的那個表示式存在或不存在;
eg:“ab?”表示“a”或“ab”
^ 表示以它後面的表示式開頭的字串;
eg:“^abc”表示以“abc”開頭的字串
$ 表示以它前面的表示式結尾的字串;
eg:“abc$”表示以“abc”結尾的字串
[ ] 表示內容的範圍;
eg:“[a-zA-Z]”表示任一字母;“[ab]”表示“a”或“b”
{} 表示數量的範圍;
eg:“{2}”表示2個;“{2,5}”表示2個到5個;“{3,}”表示至少3個;
| 表示 或;
eg:“a|b”表示“a”或“b”
\num num為一個整數,表示前面的表示式複製num次;
eg:“(ab)\3”表示“ababab”
\b 表示單詞的開始或結束;
\d 表示數字,相當於“[0-9]”;
\s 表示任意空白符;
\w 表示任意字元數字或下劃線或漢字,相當於“[a-zA-Z0-9\u4E00-\u9FFF_]”
3.字元轉義
\ 表示字元轉義,如果我們要使用元字元的字面意思的話,就需要轉義字元進
行字元轉義。
eg:“\.”表示“.”;“\*”表示“*”;“\\”表示“\”;
4.反義字元
\W 表示不是字元數字下劃線或者漢字的字元;
\S 表示任意不是空白符的字元;
\D 表示不是數字的字元;
\B 表示不是單詞開頭或結束的位置;
[^x] 表示除“x”外的任意字元;
[^abc] 表示除“a”“b”“c”外的任意字元;
OC中正規表示式的寫法又有些微的不同,使用轉義字元作用在元字元(. $ | ( ) [ { ^ ? * + \)上的時候要在轉義字元前再加“\”。eg:正常規則下,“.”表示換行符以外的任意字元,“\.”表示“.”;在OC中,“.”依然表示換行符以外的任意字元,“\\.”表示“.”。簡單點理解就是按正常的規則先寫表示式,然後把寫好的表示式中的所有“\”都替換為“\\”即可。
更多正規表示式的語法可參考http://deerchao.net/tutorials/regex/regex.htm
幾個例項:
郵箱格式驗證:
- (BOOL)validateEmail:(NSString *)email {
NSString *aimStr = [email stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *regex = @"^[a-zA-Z0-9]\\w*@[a-zA-Z0-9]+\\.[a-zA-Z]{2,4}$";
NSPredicate *emailValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [emailValidate evaluateWithObject:email];
}
手機號碼驗證
//聯通號段:130 131 132 145 146 155 156 166 171 175 176 185 186
//移動號段:134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 198
//電訊號段:133 149 153 173 174 177 180 181 189 199
- (BOOL)validatePhone:(NSString *)phone {
NSString *aimStr = [phone stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *CUregex = @"^1(3[012]|4[56]|5[56]|66|7[156]|8[56])[0-9]{8}$";
NSString *CMregex = @"^1(3[4-9]|4[78]|5[012789]|7[28]|8[23478]|98)[0-9]{8}$";
NSString *CTregex = @"^1(33|49|53|7[347]|8[019]|99)[0-9]{8}$";
NSPredicate *CUemailValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CUregex];
NSPredicate *CMemailValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CMregex];
NSPredicate *CTemailValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CTregex];
if ([CUemailValidate evaluateWithObject:aimStr]||[CMemailValidate evaluateWithObject:aimStr]||[CTemailValidate evaluateWithObject:aimStr]) {
return YES;
}
return NO;
}
車牌號驗證
//除了原有的五位車牌號之外,增加兩種新能源汽車車牌號,小型家庭用車:在城市碼之後加D或F,再加五位編碼;大型汽車:城市碼之後是五位編碼,再加D或F;D和F分別表示純電動車和混合動力汽車。
- (BOOL)validateCarNumber:(NSString *)carNo {
NSString *aimStr = [carNo stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *regex = @"^[\\u4E00-\\u9FFF][a-zA-Z]([DFdf][a-zA-Z0-9]{5}|[A-Za-z0-9]{5}|[a-zA-Z0-9]{5}[DFdf])$";
NSPredicate *carNoValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [carNoValidate evaluateWithObject:aimStr];
}
身份證號驗證
//18位的身份證號前十七位是本體碼,最後一個是校驗碼(0-10),10用羅馬數字x或X代替
//使用身份證的校驗方法和校驗碼可以判定身份證的真假,校驗方法如下:
//1.7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2這十七個係數分別和身份證號的前十七位數字相乘,然後將結果相加
//2.將上一步的計算結果除以11,求餘數(0到10之間)
//3.上一步中的餘數從0到10分別對應1-0-X-9-8-7-6-5-4-3-2,也就是身份證號的最後一位,如果不符合就是假的
- (BOOL)validatePersonalID:(NSString *)personID {
NSString *aimStr = [personID stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *regex = @"^[1-6][0-7]0[0-9]{14}[0-9Xx]$";
NSPredicate *personValidate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if (![personValidate evaluateWithObject:aimStr]) {
return NO;
} else {
NSArray *modulusArr = @[@7,@9,@10,@5,@8,@4,@2,@1,@6,@3,@7,@9,@10,@5,@8,@4,@2];
NSArray *referArr = @[@1,@0,@10,@9,@8,@7,@6,@5,@4,@3,@2];
NSInteger sum = 0;
for (int i = 0; i<aimStr.length-1; i++) {
NSString *temp = [aimStr substringWithRange:NSMakeRange(i, 1)];
sum += [temp intValue]*(int)modulusArr[i];
}
int remainder = sum % 11;
int refer = (int)referArr[remainder];
if ([[aimStr substringWithRange:NSMakeRange(personID.length-1, 1)] intValue] != refer) {
return NO;
}
return YES;
}
}
銀行卡號驗證
//國內的銀行卡卡號基本上是16位或者19位,幾乎所有的卡號都滿足Luhn演算法規則,所以銀行卡的驗證就不使用正規表示式了
//銀行卡號編碼規則及其應用https://zhuanlan.zhihu.com/p/21399490
//根據BIN碼查銀行卡種http://blog.csdn.net/archer119/article/details/52081046
- (BOOL)validateBankNo:(NSString *)bankNo {
NSString *aimStr = [bankNo stringByReplacingOccurrencesOfString:@" " withString:@""];
if (aimStr.length == 0) {
return NO;
} else {
NSMutableArray *noArr = [NSMutableArray array];
int sum = 0;
for (NSInteger i = aimStr.length-1; i>=0; i--) {
int tempNo = [[aimStr substringWithRange:NSMakeRange(i, 1)] intValue];
if ((aimStr.length-i-1)%2 == 0) {
[noArr addObject:@(tempNo)];
} else {
[noArr addObject:tempNo*2>9 ? @(tempNo*2-9) : @(tempNo*2)];
}
}
for (NSNumber *number in noArr) {
sum += (int)number;
}
return sum%10==0;
}
}
相關文章
- 正規表示式的基本語法
- 正規表示式-語法大全
- Java正規表示式的語法與示例Java
- java 正規表示式語法學習Java
- OC: 手機號正規表示式(新)
- 通過js正規表示式例項學習正規表示式基本語法JS
- js正規表示式基本語法學習JS
- Python語法進階(2)- 正規表示式Python
- 正規表示式及多語言操作指南
- JS常用正規表示式及驗證時間的正規表示式JS
- 正規表示式同時匹配中英文及常用正規表示式
- 無法在 nginx 的 “if” 正規表示式中使用變數?Nginx變數
- 正規表示法
- 【正規表示式】常用的正規表示式(數字,漢字,字串,金額等的正規表示式)字串
- iOS-正規表示式使用iOS
- 一次性搞懂JavaScript正規表示式之語法JavaScript
- 正規表示式在Java中的使用Java
- python正規表示式問號的使用Python
- oracle正規表示式語法介紹及實現手機號碼匹配方法Oracle
- Oracle中的正規表示式(及函式)詳解Oracle函式
- 正規表示式
- 正規表示式.
- 正規表示式詳解及實戰
- 快速掌握grep命令及正規表示式
- 現代 ABAP 程式語言中的正規表示式
- Linux 的正規表示式Linux
- php –正規表示式PHP
- 【Linux】正規表示式Linux
- 【JavaScript】正規表示式JavaScript
- URL正規表示式
- 正規表示式 split()
- 初探正規表示式
- 正規表示式 test()
- 正規表示式(?!)作用
- 正規表示式 {n,}
- SQL正規表示式SQL
- 正規表示式(java)Java
- Python——正規表示式Python
- PHP正規表示式PHP