如何在iOS中使用正则表达式匹配

时间:2015-05-11 04:07:32

标签: ios regex expression

例如,以下是我想要匹配的来源:

<div class="cont">

我用

<div\s+class\=\"cont\">

但如果我修改表达式

,它就不起作用
<div\s+class\=.*?cont.*?>

现在,它可以给我我想要的结果。

所以我认为,问题应该在于“这个角色。

以下是我在iOS中使用的代码,它可以用于其他一些正则表达式:

        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:reg options:NSRegularExpressionCaseInsensitive error:nil];

    NSArray *matches = [regex matchesInString:resultStr options:0 range:NSMakeRange(0, [resultStr length])];

    for (NSTextCheckingResult *match in matches) {

        NSRange matchRange = [match range];

        NSString *tagString = [resultStr substringWithRange:matchRange];

        [resultArr addObject:tagString];

    }

2 个答案:

答案 0 :(得分:0)

您正在尝试将HTML与正则表达式匹配。这绝对是非常麻烦的,因为你收到的HTML可以全部大写,单引号可以用来代替双重或丢失等等。

那就是说,如果你真的需要一个正则表达式解决方案,我建议在class=cont之前考虑任意数量的属性,并允许任何属性值分隔符:

NSString *pattern = @"<div\\b[^<]*class=[\"']?cont\\b[^<]*>";

在这里,我使用\b来匹配字边界,[^<]*检查class之前的任何其他属性,["']?允许单引号或双引号或没有,然后\b确保cont后跟非单词字符,[^<]*在最终>之前检查任何其他属性。

此外,\"会转义一次,因为它是C字符串分隔符,\\b会转义两次,以确保我们将\b传递给正则表达式引擎。

CodingGround的示例代码:

#import <Foundation/Foundation.h>
#import <Foundation/NSTextCheckingResult.h>

int main (int argc, const char * argv[])
{
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSError *error = nil;
    NSString *pattern = @"<div\\b[^<]*class=[\"']?cont\\b[^<]*>";
    NSString *string = @"<div class=\"cont\">";
    NSRange range = NSMakeRange(0, string.length);
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
    NSArray *matches = [regex matchesInString:string options:0 range:range];
    for (NSTextCheckingResult *match in matches) {
       NSRange matchRange = [match range];
       NSString *m = [string substringWithRange:matchRange];
       NSLog(@"Matched string: %@", m);
    }

   [pool drain];
   return 0;
}

答案 1 :(得分:0)

以下是代码:

NSString *stricterFilterString = @"[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}";
NSString *laxString = @".+@([A-Za-z0-9]+\\.)+[A-Za-z]{2}[A-Za-z]*";
NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];