gpt4 book ai didi

ios - NSRegularExpression 捕获无效 JSON 的部分

转载 作者:行者123 更新时间:2023-11-29 00:27:54 29 4
gpt4 key购买 nike

我尝试对以下字符串执行正则表达式字符串提取:{"code":5,"id":104,"message":"Not working"} .我需要执行提取,因为有时多个字符串会像这样捆绑在一起:{.....}{...}{......}

我已经在使用 JSONSerialization 处理单个消息像这样传入的情况:{"code":5,"id":104,"message":"Not working"}

当我收到如下消息时,我需要正则表达式来提取各个字符串:{"code":5,"id":104,"message":"Not working"}{"code":5,"id":101,"message":"some message"}{"code":5,"id":105,"message":"test"}

我有以下匹配字符串的正则表达式:{.*?"id":104.*?}

NSError  *error  = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"{.*?\"id\":104.*?}" options:NSRegularExpressionCaseInsensitive error:&error];
//regex is returning (null) here

NSRange range = [regex rangeOfFirstMatchInString:msg options:0 range:NSMakeRange(0, [msg length])];

NSString *result = [msg substringWithRange:range];
//Result is empty

[regex enumerateMatchesInString:msg options:0 range:NSMakeRange(0, [msg length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSRange range = [result rangeAtIndex:1];
NSString *regexStr = [msg substringWithRange:range];
}];

我认为问题出在我的正则表达式上。我可能没有正确转义它。

我试过 {.*?\\\"id\\\":104.*?} 但结果是一样的。

当多个字符串到达​​时,我需要一个正则表达式来管理和提取字符串,我说得对吗?

最佳答案

  NSString *string = @"{\"code\":5,\"id\":104,\"message\":\"Not working\"}{\"code\":5,\"id\":101,\"message\":\"some message\"}{\"code\":5,\"id\":105,\"message\":\"test\"}";

NSLog(@"String: %@", string);

NSMutableArray *allSubDictAsStr = [[NSMutableArray alloc] init];

NSString *pattern = @"\\{.*?\\}";
NSError *errorRegex = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&errorRegex];
NSArray *results = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];
for (NSTextCheckingResult *aResult in results)
{
NSString *subJSONStr = [string substringWithRange:[aResult range]];
[allSubDictAsStr addObject:subJSONStr];
}
NSString *bigJSONStr = [NSString stringWithFormat:@"[%@]", [allSubDictAsStr componentsJoinedByString:@","]];

NSError *errorJSON = nil;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:[bigJSONStr dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&errorJSON];
NSLog(@"JsonArray: %@", jsonArray);

这是一个可能的解决方案,它不是很干净,但我必须使用正则表达式。您的问题可能与您的 WebSocket 解析有关。

想法:
• 使用正则表达式来隔离每个字典 JSON。
• 然后构造一个“字典 JSON 数组”(bigJSONStr,在我们的例子中为 NSString)。

对于模式,请注意您必须对 {} 进行转义,因为它们在正则表达式中是保留的。我没有检查NSError参数,当然不推荐。

编辑:
附加说明/修改:而不是构建“bigJSONStr”(这非常丑陋)

NSMutableArray *allResponses = [[NSMutableArray alloc] init];
...
for (NSTextCheckingResult *aResult in results)
{
NSString *subJSONStr = [string substringWithRange:[aResult range]];
NSError *errorJSON = nil;
NSDictionary *aResponseDict = [NSJSONSerialization JSONObjectWithData:[subJSONStr dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&errorJSON];
if (!errorJSON) [allResponses addObject:subJSONStr];
}
NSLog(@"allResponses: %@", allResponses);

关于ios - NSRegularExpression 捕获无效 JSON 的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42578978/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com