正则表达式Regular Expression

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
Snip20170111_19.png
  • 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);
}];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容