捕获不在NSRegularExpression中工作的组

为什么这个代码只是吐出整个正则expression式匹配而不是捕获组?

input

@"A long string containing Name:</td><td>A name here</td> amongst other things" 

预期产量

 A name here 

实际产出

 Name:</td><td>A name here</td> 

 NSString *htmlString = @"A long string containing Name:</td><td>A name here</td> amongst other things"; NSRegularExpression *nameExpression = [NSRegularExpression regularExpressionWithPattern:@"Name:</td>.*\">(.*)</td>" options:NSRegularExpressionSearch error:nil]; NSArray *matches = [nameExpression matchesInString:htmlString options:0 range:NSMakeRange(0, [htmlString length])]; for (NSTextCheckingResult *match in matches) { NSRange matchRange = [match range]; NSString *matchString = [htmlString substringWithRange:matchRange]; NSLog(@"%@", matchString); } 

源自Apple文档的代码。 我知道还有其他的图书馆可以这样做,但是我想坚持这个任务的内容。

您将使用以下方式访问第一组范围:

 for (NSTextCheckingResult *match in matches) { //NSRange matchRange = [match range]; NSRange matchRange = [match rangeAtIndex:1]; NSString *matchString = [htmlString substringWithRange:matchRange]; NSLog(@"%@", matchString); } 

不要使用正则expression式或NSScannerparsingHTML。 在那条路上是疯狂的。

这已经被问了很多次。

parsingiPhone上的HTML

我所挑选的数据就像<td>Name: A name</td>简单,我认为它足够简单,只需使用正则expression式,而不是在项目中包含完整的HTMLparsing器。

对你而言,我是一个强有力的倡导者,“首先上市有巨大的优势”。

不同的是,使用合适的HTMLparsing器,您正在考虑文档的结构。 使用正则expression式,您将依赖文档从不改变格式的方式,在语法上完全有效。

也就是说,如果input是<td class="name">Name: A name</td> ? 你的正则expression式parsing器只是在input时打破了有效的HTML,并且从标签内容的angular度来看,与原始input相同。

HTML不是常规语言,不能使用正则expression式正确parsing。 这是一个经典的答案,解释了这个常见的程序员的错误。

在swift3

 //: Playground - noun: a place where people can play import UIKit /// Two groups. 1: [AZ]+, 2: [0-9]+ var pattern = "([AZ]+)([0-9]+)" let regex = try NSRegularExpression(pattern: pattern, options:[.caseInsensitive]) let str = "AA01B2C3DD4" let strLen = str.characters.count let results = regex.matches(in: str, options: [], range: NSMakeRange(0, strLen)) let nsStr = str as NSString for a in results { let c = a.numberOfRanges print(c) let m0 = a.rangeAt(0) //< Ex: 'AA01' let m1 = a.rangeAt(1) //< Group 1: Alpha chars, ex: 'AA' let m2 = a.rangeAt(2) //< Group 2: Digital numbers, ex: '01' // let m3 = a.rangeAt(3) //< Runtime exceptions let s = nsStr.substring(with: m2) print(s) } 

或者只是使用

 [htmlString firstMatchedGroupWithRegex:@"Name:</td>.*\">(.*)</td>"] 

从这个类别https://github.com/damienromito/NSString-Matcher

Interesting Posts