美文网首页
正则表达式简单学习

正则表达式简单学习

作者: 冷武橘 | 来源:发表于2020-10-21 16:37 被阅读0次
     ".": 几乎表示所有字符串

     "*”:表示没有或更多;
   
    "+":表示一次或更多;

  “ab*”:表示一个字符串有一个a后面跟着零个或若干个b(”a”, “ab”, “abbb”,……);

  “ab+”:表示一个字符串有一个a后面跟着至少一个b或者更多( ”ab”, “abbb”,……);

 “[ab]“:表示一个字符串有一个”a”或”b”(相当于”a|b”);

   “[a-d]“:表示一个字符串包含小写的'a'到'd'中的一个(相当于”a|b|c|d”或者”[abcd]“);

    “ \d ”:匹配一个数字字符。等价于[0-9]。

 “ab{4}”:表示一个字符串有一个a跟着4个b(”abbbb”);
 “ab{1,}”:表示一个字符串有一个a跟着至少1个b(”ab”,”abb”,”abbb”,……);
  “ab{3,4}”:表示一个字符串有一个a跟着3到4个b(”abbb”,”abbbb”)。
 那么,“*”可以用{0,}表示,“+”可以用{1,}表示,“?”可以用{0,1}表示

   
 “^one”:表示所有以”one”开始的字符串(”one cat”,”one123″,·····);
  “a dog$”:表示所以以”a dog”结尾的字符串(”it is a dog”,·····);
 “banana”:表示任何包含”banana”的字符串。
   “^apple$”:表示开始和结尾都是”apple”的字符串,这个是唯一的~;

1、NSPredicate

    NSString *str = @"a";
    NSString* number=@"ab*";
    NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
    BOOL match = [numberPre evaluateWithObject:str];
    if (match) {
        NSLog(@"匹配");
    }else{
        NSLog(@"不匹配");
    }

注意:谓词与正则表达式连用,只有字符串所有位数匹配才会返回ture
eg:

    NSString *str = @"two rttt";
    NSString* number=@"^two";
    NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
    BOOL match = [numberPre evaluateWithObject:str];
    NSLog(@"不匹配");

   NSString *str = @"two dog";
    NSString* number=@"dog$";
    NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
    BOOL match = [numberPre evaluateWithObject:str];
    NSLog(@"不匹配");

    NSString *str = @"two dog";
    NSString* number=@"dog";
    NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
    BOOL match = [numberPre evaluateWithObject:str];
    NSLog(@"不匹配");

虽说 ^two 表示的是以two开头的字符串,但是这里的^two正则表达式只能说明要匹配的字符串是3位。所以使用谓词来判断是否匹配字符串,首先看字符串位数匹配不,位数都不匹配肯定就不匹配了。其它dog$、dog同理是位数不匹配。

    NSString *str = @"two dog";
    NSString* number=@"two.*dog$";
    NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
    BOOL match = [numberPre evaluateWithObject:str];
    NSLog(@"匹配");

"two.dog$" 这里的"."表示任意字符串,""表示重复0次或更多。首先正则表达式位数是模糊的,但肯定是匹配str位数的。然后都是dog结尾,因此整个就匹配了。

2、NSRegularExpression

    NSString *searchText = @"你很世界,</div>标题1</div>";
 
    NSString *rules = @"</div>.*?</div>";
    
    NSError *error = NULL;

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:rules options:NSRegularExpressionCaseInsensitive error:&error];

    NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];

    if (result) {

      NSLog(@"%@", [searchText substringWithRange:result.range]);
    }

输出:</div>标题1</div>

  • 贪婪匹配:尽可能匹配最长的字符串
 NSString *searchText = @"你很世界,</div>标题1</div></div>标题1</div>";
    NSString *rules = @"</div>.*</div>";
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:rules options:NSRegularExpressionCaseInsensitive error:&error];
    NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
    if (result) {
       NSLog(@"%@", [searchText substringWithRange:result.range]);
    }

输出:</div>标题1</div></div>标题1</div>

  • 非贪婪匹配: 尽可能匹配最短的字符串
    默认情况下匹配都是贪婪模式,如果要改成非贪婪模式,只需要量词后面加上一个问号?。非贪婪模式在第一次匹配成功后就会停止匹配。

1、查找一个div标签

    NSString *searchText = @"你很世界,</div>标题1</div></div>标题1</div>";
    NSString *rules = @"</div>.*?</div>";
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:rules options:NSRegularExpressionCaseInsensitive error:&error];
    NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
    if (result) {
       NSLog(@"%@", [searchText substringWithRange:result.range]);
    }

输出:</div>标题1</div>

2、查找所有的div标签

    NSString *testString1 = @"你很世界,</div>aaaaa</div>eerrrrrrr</div>bbbbbbb</div>";
    NSError *error;
    NSString* regexString = @"</div>.*?</div>";
    //创建一个正则表达式对象,存储匹配规则
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexString options:0 error:&error];
    if (regex != nil) {
        //用该方法解析出所有
        NSArray* array = [regex matchesInString:testString1 options:NSMatchingReportProgress range:NSMakeRange(0, [testString1 length])];
        NSMutableArray* stringArray = [[NSMutableArray alloc] init];
        
        //当解析出的数组至少有一个对象时,即原文本中存在至少一个符合规则的字段
        if (array.count != 0) {
            for (NSTextCheckingResult* result in array) {
                //从NSTextCheckingResult类中取出range属性
                NSRange range = result.range;
                //从原文本中将字段取出并存入一个NSMutableArray中
                [stringArray addObject:[testString1 substringWithRange:range]];
            }
        }
        NSLog(@"%@",stringArray);
    }

输出: (
"</div>aaaaa</div>",
"</div>bbbbbbb</div>"
)

参考:https://www.jianshu.com/p/974dee8953e6
https://www.jianshu.com/p/e48c8c3e2ff4
https://www.jianshu.com/p/63d088b5f3e5

相关文章

  • Python学习随笔

    本笔记整理自中谷教育在线教育视频 学习笔记——正则表达式常用符号 这里学习过正则表达式后,简单做了一个爬虫程序,效...

  • Python正则表达式初识(一)

    首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式。正则表达式在处理字符串的时候...

  • 遇见正则表达式(1)

    从今天开始,我们来简单聊聊正则表达式。今天主要是想和大家一起学习正则表达式的语法。 概念 什么是正则表达式?我个人...

  • Python正则表达式初识(一)

    首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式。正则表达式在处理字符串的时候...

  • 2019-08-05 《python爬虫开发:从入门到实战》

    1.正则表达式 学习了简单的正则表达式使用。通过这个书发现,实际爬虫过程中,用正则表达式去匹配内容,并不是非常常用...

  • Python正则表达式初识(一)

    首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式。正则表达式在处理字符串的时候...

  • Python正则表达式最全详解!玩爬虫从正则开始!

    首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式。正则表达式在处理字符串的时候...

  • Python 学习笔记 071

    正则表达式学习 续4 分组 概念:除了简单的判断是否匹配之外,正则表达式还有提取子串的功能。 用()表示的就是提取...

  • python爬虫day-13(正则表达式)

    个人学习笔记,方便自己查阅,仅供参考,欢迎交流 正则表达式 1.简单示例 开源中国提供的正则表达式测试网址:htt...

  • 读懂正则表达式就这么简单

    读懂正则表达式就这么简单 - Zery - 博客园 读懂正则表达式就这么简单 一 前言 对于正则表达式,相信很多人...

网友评论

      本文标题:正则表达式简单学习

      本文链接:https://www.haomeiwen.com/subject/tucemktx.html