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

正则表达式简单学习

作者: 冷武橘 | 来源:发表于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

    相关文章

      网友评论

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

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