2017-03-03 7 views
0

Ich habe die folgende Zeichenfolge, die ich versuche, eine Regex-String-Extraktion durchzuführen: {"code":5,"id":104,"message":"Not working"}. Ich muss eine Extraktion durchführen, da manchmal mehrere Zeichenfolgen wie folgt gebündelt werden können: {.....}{...}{......}NSRegularExpression zum Erfassen von Teilen ungültiger JSON

Ich verwende bereits JSONSerialization für die Fälle, wenn einzelne Nachrichten wie folgt eintreffen: {"code":5,"id":104,"message":"Not working"}.

Ich brauche die Regex, um die einzelnen Zeichenfolgen zu extrahieren, wenn ich die Nachrichten wie folgt erhalten: {"code":5,"id":104,"message":"Not working"}{"code":5,"id":101,"message":"some message"}{"code":5,"id":105,"message":"test"}.

Ich habe die folgende Regex, die die Zeichenfolge entspricht: {.*?"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]; 
}]; 

Ich glaube, das Problem mit meiner regex ist. Ich könnte nicht richtig entkommen.

Ich habe versucht {.*?\\\"id\\\":104.*?} aber das Ergebnis ist das gleiche.

Bin ich damit einverstanden zu sagen, dass ich eine Regex brauchen würde, um die Strings zu verwalten und zu extrahieren, wenn mehrere ankommen?

+0

Ich denke, es ist eine Art von JOSN Formiat, warum Sie nicht JSONSerilation für diesen Einsatz ? – CodeChanger

+0

ist dies "{" code ": 5," id ": 104," nachricht ":" Nicht funktioniert "}' string oder dicioanry –

+0

Wie erwähnt - es sieht so aus, als ob Sie das falsche Werkzeug für den Job verwenden. Das sieht für mich wie JSON aus. Welche Regex ist nicht das Richtige zu tun – Tander

Antwort

1
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); 

, dass eine mögliche Lösung ist, ist es nicht wirklich sauber ist, aber ich habe mit Regex zu spielen. Ihr Problem könnte mehr in Ihrem WebSocket-Parsing liegen.

Idee:
• Verwenden Sie einen Regex, um jedes Dictionary JSON zu isolieren.
• Konstruieren Sie dann ein "Array von Wörterbüchern JSON" (bigJSONStr, wie NSString in unserem Fall).

Beachten Sie für das Muster, dass Sie { und } umgehen müssen, da sie in Regulärer Ausdruck reserviert sind. Ich habe die NSError Parameter nicht überprüft, was natürlich nicht empfohlen wird.

EDIT:
Zusätzliche Anmerkung/Änderung: Anstatt „bigJSONStr“ Konstruktion (die ziemlich hässlich)

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); 
+0

Alles, was ich tun musste, war die Flucht aus dem '{' und '}'. Vielen Dank Larme – mhorgan

0

tun wie

//{"code":5,"id":104,"message":"Not working"} 

// initially convert your JSON string to NSData 
NSData *objectData = [JsonString dataUsingEncoding:NSUTF8StringEncoding]; 
    NSError *error; 
// deserialize using NSJSONSerialization 
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData options:0 error:&error]; 

// then serilize what ever your string 
if (json) 
{ 
NSString * code = json[@"code"]; 
NSString * ide = json[@"id"]; 
NSString * message = json[@"message"]; 
} 
+1

Veröffentlichen Sie keine Code-Only-Antworten. Stellen Sie einige Informationen zur Verfügung, was Sie getan haben und warum das so ist. –

+1

@Sneak - Beschreibung der aktualisierte –

+0

Upvoted. Behalte es auch in deinen anderen Posts bitte ähnlich. Gute Arbeit. –

Verwandte Themen