一、基本語法

二、與js的正則對比
- 多了 \A 字符串開頭, \Z 字符串結(jié)尾,
- 和^$的區(qū)別就是,^$有兩義性,在多行模式下會匹配行頭尾
- 而\A\Z只匹配整個字符串的頭尾,不管何種模式
- 多了命名分組 (?P<id>), 與分組引用 (?P=name)
- 多了向左預(yù)匹配 (?<=) 與 (?<!)
- 多了條件分情況匹配 (?(No/name)yes-pattern|no-pattern), 根據(jù)前面某個索引或者具名分組是否匹配到來決定接下來啟動哪一個匹配項
- 必須先有前面分組,后面判定組才能引用
- 引用可以使用索引,也可以使用具名
三、注意事項
- “.”字符集不包含換行,某些場景必須使用
[\s\S]這樣的全集代替 - 在iOS中,正則以字符串的形式存儲,轉(zhuǎn)義符必須為雙斜扛
- 在線測試環(huán)境,regexp
四、iOS中的使用方式
1、使用字符串的子串查找方法
NSString *re = @"\\d+";
NSString *testStr = @"my number is 13662680007";
NSRange range = [testStr rangeOfString:re options:NSRegularExpressionSearch];
if(range.location != NSNotFound){
NSString *ret = [testStr substringWithRange:range];
NSLog(@"%@", ret);
}else{
NSLog(@"not find");
}
2、使用謂詞模糊查詢方法
+ (BOOL)checkTelNumber:(NSString *) telNumber
{
NSString *pattern = @"^1+[3578]+\\d{9}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:telNumber];
if (telNumber.length != 11) {
return NO;
}
return isMatch;
}
3、使用正則表達(dá)式對象匹配方法
// 手機號碼匹配
NSString *pattern = @"1[3578]\\d{9}$";
NSError *error = nil;
/*
typedef NS_OPTIONS(NSUInteger, NSRegularExpressionOptions) {
NSRegularExpressionCaseInsensitive = 1 << 0, //不區(qū)分字母大小寫的模式
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, //忽略掉正則表達(dá)式中的空格和#號之后的字符
NSRegularExpressionIgnoreMetacharacters = 1 << 2, //將正則表達(dá)式整體作為字符串處理
NSRegularExpressionDotMatchesLineSeparators = 1 << 3, //允許.匹配任何字符,包括換行符
NSRegularExpressionAnchorsMatchLines = 1 << 4, //允許^和$符號匹配行的開頭和結(jié)尾
NSRegularExpressionUseUnixLineSeparators = 1 << 5, //設(shè)置\n為唯一的行分隔符,否則所有的都有效。
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 //使用Unicode TR#29標(biāo)準(zhǔn)作為詞的邊界,否則所有傳統(tǒng)正則表達(dá)式的詞邊界都有效
};
*/
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
NSArray<NSTextCheckingResult *> *result = [regex matchesInString:str options:0 range:NSMakeRange(0, str.length)];
if (result) {
for (int i = 0; i<result.count; i++) {
NSTextCheckingResult *res = result[i];
NSLog(@"str == %@", [str substringWithRange:res.range]);
}
}else{
NSLog(@"error == %@",error.description);
}
}
四、常用正則表達(dá)式
(1)驗證電話號碼:(”^(\d{3,4}-)\d{7,8}$”)
(2)驗證Email地址:(“^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$”);
(3)整數(shù)或者小數(shù):^[0-9]+([.]{0,1}[0-9]+){0,1}$
(4)只能輸入數(shù)字:”^[0-9]*$”。
(5)只能輸入由26個英文字母組成的字符串:”^[A-Za-z]+$”。
(6)驗證是否含有%&’,;=?$\”等字符:”[%&',;=?$\x22]+”。
(7)只能輸入漢字:”^[\u4e00-\u9fa5]{0,}$”。
(8).驗證一年的12個月:”^(0?[1-9]|1[0-2])$”正確格式為:”01″~”09″和”10″~”12″。
(9)驗證一個月的31天:”^((0?[1-9])|((1|2)[0-9])|30|31)$”正確格式為;”01″~”09″、”10″~”29″和“30”~“31”。
(10)獲取日期正則表達(dá)式:\d{4}[年|-|.]\d{\1-\12}[月|-|.]\d{\1-\31}日? 注:可用來匹配大多數(shù)年月日信息。
(11)匹配空白行的正則表達(dá)式:\n\s*\r 注:可以用來刪除空白行
(12)匹配帳號是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 注:表單驗證時很實用
(13)匹配騰訊QQ號:[1-9][0-9]{4,} 注:騰訊QQ號從10 000 開始
(14)匹配中國郵政編碼:[1-9]\d{5}(?!\d) 注:中國郵政編碼為6位數(shù)字
(15)匹配ip地址:((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。