例如,以下是我想要匹配的源:
<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];