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