如何创建正则表达式来提取目标C中的十六进制数字?

时间:2016-12-21 03:11:46

标签: objective-c regex

所以我从这样的系统得到一个字符串结果,我必须捕获所有的十六进制部分,不包括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中捕获022.20.02 2.20.02,这是我不想要的。一些网站告诉我,我只会获取捕获括号之间的数据,但事实并非如此。有人可以帮忙吗?感谢。

2 个答案:

答案 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]];
}