所以我从这样的系统得到一个字符串结果,我必须捕获所有的十六进制部分,不包括0x
:
[System Info] 2.20.02 2.20.02 - Extended Data:
0xAC, 0x4D, 0xDE, 0x04, 0xA4, 0x10, 0x73, 0x89, 0xDF, 0xFF, 0x01, 0x01, 0x01, 0xDF, 0x5A, 0x10,
0x34, 0x37, 0x35, 0x36, 0x33, 0xC1, 0x10, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x37, 0x38, 0x31, 0x32,
0x9F, 0xDD, 0x01, 0xB5, 0x42, 0x03, 0x45, 0x56, 0x33, 0x2F, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00,
0x00, 0x15, 0xA3, 0x21, 0x03, 0x09, 0x51, 0x09, 0x9A, 0xE5, 0x16, 0x12, 0x21, 0x9F, 0x34, 0x03,
0x03, 0x1E, 0x03, 0xCE, 0x04, 0x00, 0x12, 0x00, 0x00, 0xDF, 0xFF, 0x02, 0x01, 0x1A,
我创建了一个函数,可以帮助我将子串提取到数组中:
+ (NSArray *) regexPattern:(NSString *)pattern toExtract:(NSString *)string{
NSError *error;
NSRegularExpression * regexp = [NSRegularExpression regularExpressionWithPattern:pattern
options:NSRegularExpressionCaseInsensitive error:&error];
if (error == nil) { return nil; }
NSMutableArray * matches = [[regexp matchesInString:string options:0 range:NSMakeRange(0, [string length])] mutableCopy];
[matches removeObjectAtIndex:0]; // because it contains all the string.
NSMutableArray * result = [[NSMutableArray alloc] init];
for (NSTextCheckingResult * match in matches) {
[result addObject:[string substringWithRange:[match range]]];
}
[matches release];
return result;
}
但现在问题是正则表达式。我尝试使用捕获组()
仅使用此模式捕获十六进制部分:0x(..),
。此模式捕获整个0xFD,
而不是FD
。如果我使用([\dA-F]){2}
,我可以获得所有十六进制,但我也会从20
中捕获02
和2.20.02 2.20.02
,这是我不想要的。一些网站告诉我,我只会获取捕获括号之间的数据,但事实并非如此。有人可以帮忙吗?感谢。
答案 0 :(得分:3)
简而言之,不要。正则表达式非常有用,但不适用于这样一个定义良好,简单的输入集。
请在此处查看热门答案以获取解释:RegEx match open tags except XHTML self-contained tags
相反,请使用NSScanner。它非常擅长扫描十六进制字符串并根据需要跳过字符。它会更快更清晰(正则表达式的问题在于匹配的模糊性质会产生一个解析器,通常很容易被有目的错误构造的输入欺骗,混淆或攻击)。
这是一个非常好的起点:
Objective-C parse hex string to integer
我首先找到"扩展数据:"然后使用扫描程序跳过0x,然后扫描解析十六进制#,然后使用扫描程序跳过&# 34;,0x"等...
答案 1 :(得分:1)
您可以使用0x(..),
作为正则表达式,但是在迭代匹配时,而不是在substringWithRange:[match range]
中使用[result addObject:[string substringWithRange:[match range]]];
添加整个匹配字符串部分,您需要只需添加第一组(括号中的部分)
你可以这样做
for (NSTextCheckingResult * match in matches) {
NSRange groupRange = [match rangeAtIndex:1];
[result addObject:[string substringWithRange:groupRange]];
}