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



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

<div class="cont">

我使用

<divs+class="cont">

但如果我像一样修改表达式,它就不起作用

<divs+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];
}

您正在尝试将HTML与正则表达式相匹配。这肯定是非常麻烦的,因为你收到的HTML可能都是大写的,单引号可能会被使用,而不是双引号或缺失,等等

也就是说,如果你真的需要regex解决方案,我建议在class=cont之前考虑任何数量的属性,并允许任何属性值分隔符:

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

这里,我使用b来匹配单词边界,[^<]*class之前检查任何其他属性,["']?允许单引号或双引号,或者什么都不允许,然后b确保cont后面跟着一个非单词字符,[^<]*在最后的>之前检查任何其它属性。

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

编码场的示例代码:

#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;
}

代码如下:

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];

最新更新