正则表达式简单学习

2020-10-21  本文已影响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

上一篇 下一篇

猜你喜欢

热点阅读