Mac*_*wic 39 regex objective-c capture-group ios nsregularexpression
为什么此代码仅吐出整个正则表达式匹配而不是捕获组?
输入
@"A long string containing Name:</td><td>A name here</td> amongst other things"
Run Code Online (Sandbox Code Playgroud)
预期产出
A name here
Run Code Online (Sandbox Code Playgroud)
实际输出
Name:</td><td>A name here</td>
Run Code Online (Sandbox Code Playgroud)
码
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);
}
Run Code Online (Sandbox Code Playgroud)
代码取自Apple文档.我知道还有其他库可以做到这一点,但我想坚持使用内置的任务.
小智 67
您将使用以下方式访问第一组范围:
for (NSTextCheckingResult *match in matches) {
//NSRange matchRange = [match range];
NSRange matchRange = [match rangeAtIndex:1];
NSString *matchString = [htmlString substringWithRange:matchRange];
NSLog(@"%@", matchString);
}
Run Code Online (Sandbox Code Playgroud)
bbu*_*bum 10
不要使用正则表达式或NSScanner解析HTML.沿着这条路走下去就是疯狂.
有人多次询问这个问题.
我挑选的数据非常简单
<td>Name: A name</td>,我认为它很简单,只需使用正则表达式,而不是在项目中包含一个完整的HTML解析器.
由你和我强烈倡导"先上市有巨大优势".
不同之处在于,使用正确的HTML解析器,您正在考虑文档的结构.使用正则表达式,您依赖的文档永远不会以语法上完全有效的方式更改格式.
即如果输入是<td class="name">Name: A name</td>什么?您的正则表达式解析器刚刚打破输入,该输入既是有效的HTML,也是从标记内容的角度来看,与原始输入相同.
在 swift3 中
//: Playground - noun: a place where people can play
import UIKit
/// Two groups. 1: [A-Z]+, 2: [0-9]+
var pattern = "([A-Z]+)([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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18794 次 |
| 最近记录: |