一、基本语法

二、与js的正则对比
- 多了 \A 字符串开头, \Z 字符串结尾,
- 和^$的区别就是,^$有两义性,在多行模式下会匹配行头尾
- 而\A\Z只匹配整个字符串的头尾,不管何种模式
- 多了命名分组 (?P<id>), 与分组引用 (?P=name)
- 多了向左预匹配 (?<=) 与 (?<!)
- 多了条件分情况匹配 (?(No/name)yes-pattern|no-pattern), 根据前面某个索引或者具名分组是否匹配到来决定接下来启动哪一个匹配项
- 必须先有前面分组,后面判定组才能引用
- 引用可以使用索引,也可以使用具名
三、注意事项
- “.”字符集不包含换行,某些场景必须使用
[\s\S]
这样的全集代替 - 在iOS中,正则以字符串的形式存储,转义符必须为双斜扛
- 在线测试环境,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、使用正则表达式对象匹配方法
// 手机号码匹配
NSString *pattern = @"1[3578]\\d{9}$";
NSError *error = nil;
/*
typedef NS_OPTIONS(NSUInteger, NSRegularExpressionOptions) {
NSRegularExpressionCaseInsensitive = 1 << 0, //不区分字母大小写的模式
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, //忽略掉正则表达式中的空格和#号之后的字符
NSRegularExpressionIgnoreMetacharacters = 1 << 2, //将正则表达式整体作为字符串处理
NSRegularExpressionDotMatchesLineSeparators = 1 << 3, //允许.匹配任何字符,包括换行符
NSRegularExpressionAnchorsMatchLines = 1 << 4, //允许^和$符号匹配行的开头和结尾
NSRegularExpressionUseUnixLineSeparators = 1 << 5, //设置\n为唯一的行分隔符,否则所有的都有效。
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 //使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效
};
*/
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);
}
}
四、常用正则表达式
(1)验证电话号码:(”^(\d{3,4}-)\d{7,8}$”)
(2)验证Email地址:(“^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$”);
(3)整数或者小数:^[0-9]+([.]{0,1}[0-9]+){0,1}$
(4)只能输入数字:”^[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{4}[年|-|.]\d{\1-\12}[月|-|.]\d{\1-\31}日? 注:可用来匹配大多数年月日信息。
(11)匹配空白行的正则表达式:\n\s*\r 注:可以用来删除空白行
(12)匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[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位数字
(15)匹配ip地址:((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。
网友评论