1,正则表达式的基本使用:
//1.1,创建一个正则表达式对象:定义规则
NSString *pattern = @"[0-9]";
NSRegularExpression *regularExp = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
//1.2,利用对象进行判断(test是你要从中查找的字符串)
NSArray *results = [regularExp matchesInString:test options:0 range:NSMakeRange(0, test.length)];
//2,输出结果,注意遍历的时候里面的子类是:NSTextCheckingResultfor
for (NSTextCheckingResult *result in results) {
NSLog(@"%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}
2,正则表达式的规则:
-
2.1,查找指定的对象(比如“张”字):
NSString *pattern = @"张";//直接写在里面 -
2.2,查找指定对象中的任何一个:
-
注意⚠️:数字可以简化用\d表示,oc中需要转义,即用\\d表示
-
任意一个数字:
NSString *pattern = @"[1234567890]";
//@"[1234567890]"也可以简化成@"[0-9]",中括号代表查找内部内容的任何一个
NSString *pattern = @"[0-9]";
NSString *pattern = @"\\d"; -
比如说任何一个小写字母:
NSString *pattern = @"[a-z]"; -
比如说任何一个字母:
NSString *pattern = @"[a-zA-Z]"; -
比如说任何一个字母或者数字:
NSString *pattern = @"[a-zA-Z0-9]"; -
比如说“张三毛”三个字中的其中任何一个:
NSString *pattern = @"[张三毛]";//中括号代表查找内部内容的任何一个 -
2.3,查找指定对象中同类型连续的:
-
比如说有多少个两个数字一起的:
NSString *pattern = @"[0-9][0-9]";//NSString *test = @"1234567890",test中输出结果是5,因为有5对
NSString *pattern = @"\d\d";//这种方式还可以用大括号简化,如两个连在一起的数字,用@“\d{2}”表示 -
比如说有多少个五个个数字一起的:
NSString *pattern = @"\\d{5}"; -
比如说三个数字两个字母a连在一起:
NSString *pattern = @"\\d{3}a{2}"; -
比如说2-4个数字连在一起的:
NSString *pattern = @"\\d{2-4}";//1234输出结果为1,12345输出结果为1,123456输出结果为2! -
2.4,特殊字符在正则中的作用
-
? :0个或者1个// @"k58k789"结果为8,@"k58"结果为4,@"k5"结果为3
-
* : 0个或者多个// @"k58k789"结果为5,@"k58"结果为3,@"k5"结果为3
-
+ : 至少一个(一般用+比较多)// @"k58k789"结果为2,@"k58"结果为1,@"k5"结果为1
-
^ : 匹配字符串的开始
NSString *pattern = @"^\\d"//字符串必须以数字开头,@"1k5dd324"结果为1
NSString *pattern = @"^\\d{3}"//字符串必须以3个数字开头,@"1k5dd324"结果为0,@"231k5dd324"结果为1 -
$ : 匹配字符串的结束
NSString *pattern = @"\\d$"//字符串必须以数字结束,@"1k5dd324"结果为1
NSString *pattern = @"\\d{3}$"//字符串必须以3个数字结束,@"1k5dd324"结果为1 -
2.5,查找以数字开头并以数字结尾:
-
NSString *pattern = @"^\\d[0-9a-zA-Z]*\\d$";//*星号不可以省略,这行还可以简化如下
-
NSString *pattern = @"^\\d.*\\d$";//.代表任何字符, .*代表任意零个或者多个字符
3,正则表达式几种常见应用场景:
- 3.1,正则判断是否是QQ号码:
- 5-11位数字
- 非0开头
NSString *pattern = @"^[1-9]\\d{4,10}$";
- 3.2,正则判断是否是手机号码:
- 11位数字
- 13/15/17/183开头
NSString *pattern = @"^1[3578]\\d{9}$";
- 3.3, 正则判断是否是IP地址:
1-3个数字-1-3个数字-1-3个数字-1-3个数字
NSString *pattern = @“((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))”;
- 3.4, 正则匹配中文:
NSString *pattern = @"[\\u4e00-\\u9fa5]";
- 3.5, 正则匹配url:
NSString *pattern = @"(http|ftp|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?";
4,取出正则表达式中匹配的内容并解析:
NSString *test = @"jack13412rosee3323fdf543589dkkd";
//1,正则表达式的使用:
//1.1,创建一个正则表达式对象:定义规则
NSString *pattern = @"[a-zA-Z]+";
NSRegularExpression *regularExp = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
//1.2,利用对象进行判断
NSArray *results = [regularExp matchesInString:test options:0 range:NSMakeRange(0, test.length)];
//2,输出结果,注意遍历的时候里面的子类是:NSTextCheckingResult
for (NSTextCheckingResult *result in results) {
NSLog(@"%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}
5,匹配#,@和[]内容
//即将到来的秀恩爱高峰期[拜拜]@搞笑补习班即将到来的秀恩爱高峰期[拜拜]
NSString *test = @"即[abvc]将到来的秀恩爱高峰期[拜拜]@搞笑补习班:即将到http://c.biancheng.net/cpp/html/1435.html 来的秀恩爱高峰期[拜拜]#hahahaha# http://c.biancheng.net/cpp/html/1435.html";
- 匹配[]内容
//1,正则表达式的使用:
//1.1,创建一个正则表达式对象:定义规则
NSString *pattern = @"\\[[a-zA-Z\\u4e00-\\u9fa5]+\\]";
NSRegularExpression *regularExp = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
//1.2,利用对象进行判断
NSArray *results = [regularExp matchesInString:test options:0 range:NSMakeRange(0, test.length)];
for (NSTextCheckingResult *result in results) {
NSLog(@"--000%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}
- 匹配#内容
//1,正则表达式的使用:
//1.1,创建一个正则表达式对象:定义规则
NSString *pattern01 = @"\\#[a-zA-Z\\u4e00-\\u9fa5]+\\#";
NSRegularExpression *regularExp01 = [[NSRegularExpression alloc] initWithPattern:pattern01 options:0 error:nil];
//1.2,利用对象进行判断
NSArray *results01 = [regularExp01 matchesInString:test options:0 range:NSMakeRange(0, test.length)];
for (NSTextCheckingResult *result in results01) {
NSLog(@"--001%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}
- 匹配@内容
//1,正则表达式的使用:
//1.1,创建一个正则表达式对象:定义规则
NSString *pattern02 = @"\\@[0-9A-Za-z\\u4e00-\\u9fa5]+";
NSRegularExpression *regularExp02 = [[NSRegularExpression alloc] initWithPattern:pattern02 options:0 error:nil];
//1.2,利用对象进行判断
NSArray *results02 = [regularExp02 matchesInString:test options:0 range:NSMakeRange(0, test.length)];
for (NSTextCheckingResult *result in results02) {
NSLog(@"--002%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}
- 匹配url内容
//1,正则表达式的使用:
//1.1,创建一个正则表达式对象:定义规则
NSString *pattern03 = @"(http|ftp|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?";
NSRegularExpression *regularExp03 = [[NSRegularExpression alloc] initWithPattern:pattern03 options:0 error:nil];
//1.2,利用对象进行判断
NSArray *results03 = [regularExp03 matchesInString:test options:0 range:NSMakeRange(0, test.length)];
for (NSTextCheckingResult *result in results03) {
NSLog(@"--002%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}
6,第三方框架RegexKitLite:
- 6.1,使用⚠️:
- 1,改为MRC模式:-fno-objc-arc
-
2,需要添加动态库: libicucore.dylib
- Snip20170111_20.png
-
6.2,使用方法:
-
6.2.1,正向查找普通方法:
-
查找特殊字符
NSString *str = @"即[][abvc]将到来的#秀恩爱#高峰期[拜拜]@搞笑补习班:即将到http://c.biancheng.net/cpp/html/1435.html 来的秀恩爱高峰期[拜拜]#hahahaha# http://c.biancheng.net/cpp/html/1435.html";
//找出表情内容,如[拜拜]
NSString *emoPattern = @"\\[[a-zA-Z\\u4e00-\\u9fa5]+\\]";
NSArray *enoResults = [str componentsMatchedByRegex:emoPattern];
NSLog(@"表情内容是---%@",enoResults);
//找出@内容,如@搞笑补习班
NSString *atPattern = @"\\@[a-zA-Z\\u4e00-\\u9fa5]+";
NSArray *atResults = [str componentsMatchedByRegex:atPattern];
NSLog(@"@内容是---%@",atResults);
//找出@话题内容,如#秀恩爱#
NSString *topicPattern = @"\\#[a-zA-Z\\u4e00-\\u9fa5]+\\#";
NSArray *topicArray = [str componentsMatchedByRegex:topicPattern];
NSLog(@"热门话题的内容是---%@",topicArray);
- 6.2.2,正向查找高级方法:
- 查找特殊字符高级
NSString *str = @"即[][abvc]将到来的#秀恩爱#高峰期[拜拜]@搞笑补习班:即将到http://c.biancheng.net/cpp/html/1435.html 来的秀恩爱高峰期[拜拜dd]#hahahaha# http://c.biancheng.net/cpp/html/1435.html";
//找出表情内容,如[拜拜]
NSString *emoPattern = @"\\[[a-zA-Z\\u4e00-\\u9fa5]+\\]";
//找出@内容,如@搞笑补习班
NSString *atPattern = @"\\@[a-zA-Z\\u4e00-\\u9fa5]+";
//找出@话题内容,如#秀恩爱#
NSString *topicPattern = @"\\#[a-zA-Z\\u4e00-\\u9fa5]+\\#";
//这里直接把三个查找的对象合并一下一下子全部输出了就不在一一输出了
NSString *pattern = [NSString stringWithFormat:@"%@|%@|%@",emoPattern, atPattern,topicPattern];
[str enumerateStringsMatchedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
NSLog(@"range:%@, str:%@",NSStringFromRange(*capturedRanges), *capturedStrings);
}];
- 6.2.2,反向查找方法:
- 跟正向查找相反,查找特殊字符以外的所有其他字符
NSString *str = @"即[][abvc]将到来的#秀恩爱#高峰期[拜拜]@搞笑补习班:即将到http://c.biancheng.net/cpp/html/1435.html 来的秀恩爱高峰期[拜拜dd]#hahahaha# http://c.biancheng.net/cpp/html/1435.html";
//找出表情内容,如[拜拜]
NSString *emoPattern = @"\\[[a-zA-Z\\u4e00-\\u9fa5]+\\]";
//找出@内容,如@搞笑补习班
NSString *atPattern = @"\\@[a-zA-Z\\u4e00-\\u9fa5]+";
//找出@话题内容,如#秀恩爱#
NSString *topicPattern = @"\\#[a-zA-Z\\u4e00-\\u9fa5]+\\#";
//这里直接把三个查找的对象合并一下一下子全部输出了就不在一一输出了,只有这里的方法和正向查找不同,注意分辨
NSString *pattern = [NSString stringWithFormat:@"%@|%@|%@",emoPattern, atPattern,topicPattern];
[str enumerateStringsSeparatedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
NSLog(@"range:%@, str:%@",NSStringFromRange(*capturedRanges), *capturedStrings);
}];
网友评论