捕获不在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>"]