Ios使用字符串中的正则表达式提取数据

Shu*_*Ali 0 regex objective-c ios

我有

NSString *str =  @"<0x112233><0x112233><0x112233>0a";
Run Code Online (Sandbox Code Playgroud)

我希望这些数据保存在nsarray中

nsarray  : { 0x112233 0x112233 0x112233 }
Run Code Online (Sandbox Code Playgroud)

仅保存包含在"<>"中的数据并忽略所有其他数据.

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

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);
Run Code Online (Sandbox Code Playgroud)

但我给了我这个输出:

data (
    "<NSSimpleRegularExpressionCheckingResult: 0x1ddc5e30>{0, 30}{<NSRegularExpression: 0x1f078710> <(.*)> 0x1}"
)
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 5

(正如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}"
)
Run Code Online (Sandbox Code Playgroud)

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

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

输出:

data (
    0x112233,
    0x112233,
    0x112233
)
Run Code Online (Sandbox Code Playgroud)