ios 使用正则表达式从字符串中提取数据



>i have

NSString *str =  @"<0x112233><0x112233><0x112233>0a";

我希望此数据保存在 NSarray 中

nsarray  : { 0x112233 0x112233 0x112233 }

仅保存包含在"<>"中的数据,而忽略所有其他数据。

我像这样尝试过正则表达式

NSString *str =  @"<0x112233><0x112233><0x112233>0a";
NSError *error2;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<(.*)>"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error2];
if (error2)
{
    NSLog(@"Error %@", [error2 description]);
}
NSArray *payloadRanges=[regex matchesInString:str options:0 range:NSMakeRange(0, [str length])];

NSLog(@"data %@",payloadRanges);

但我给了我这个输出:

data (
    "<NSSimpleRegularExpressionCheckingResult: 0x1ddc5e30>{0, 30}{<NSRegularExpression: 0x1f078710> <(.*)> 0x1}"
)

(正如Pat Teen在评论中所说),你的模式是贪婪的,这意味着第一个匹配项得到尽可能多的,即整个字符串。

您可以通过将模式@"<(.*)>"更改为 @"<(.*?)>" 来解决此问题。

然后payloadRanges是一个包含三个NSTextCheckingResult对象的数组:

(
    "<NSSimpleRegularExpressionCheckingResult: 0x10010af40>{0, 10}{<NSRegularExpression: 0x100108960> <(.*?)> 0x1}",
    "<NSSimpleRegularExpressionCheckingResult: 0x10010c210>{10, 10}{<NSRegularExpression: 0x100108960> <(.*?)> 0x1}",
    "<NSSimpleRegularExpressionCheckingResult: 0x10010c250>{20, 10}{<NSRegularExpression: 0x100108960> <(.*?)> 0x1}"
)

现在,您必须从每个结果中提取与(...)组匹配的子字符串:

NSMutableArray *data = [NSMutableArray array];
for (NSTextCheckingResult *result in payloadRanges) {
    [data addObject:[str substringWithRange:[result rangeAtIndex:1]]];
}
NSLog(@"data %@",data);

输出:

data (
    0x112233,
    0x112233,
    0x112233
)

很酷,试试这行简单的手动硬编码,而无需使用任何 reg exper:

NSString *convert =[str stringByReplacingOccurrencesOfString:@"<" withString:@""];
    convert= [convert stringByReplacingOccurrencesOfString:@">" withString:@" "];
    NSLog(@"con %@",convert);
    NSMutableArray *array = (NSMutableArray *)[convert componentsSeparatedByString:@" "];
    NSLog(@"%@" ,array);
    for(NSString *str in array){
        if([str length]<4){
            [array removeObject:str];
        }
    }
    NSLog(@"%@",array);

试试这个:-

NSString *str =  @"<0x112233><0x112233><0x112233>0a";
NSArray *arr = [str componentsSeparatedByString:@"<"];
    NSString *str1 = [arr lastObject];
    NSArray *arr1 = [str1 componentsSeparatedByString:@">"];
    NSLog(@"array is %@",arr1);
    NSString *str2 = [[arr1 objectAtIndex:0] substringFromIndex:1];
NSString *str3=[str2 stringByReplacingOccurrencesOfString:@"0a" withString:@""];
NSLog(@"str3 is %@",str3);
[yourArray addObject:str3];

只是另一个应该符合您要求的正则表达式:

<([^>]*)>

最新更新