[英]Obj-c Seperate a string by double quote using regular expression
我今天剛剛學習了正則表達式,並且有了這個NSString:
{"Mon":["Operation System;Monday 1,2{9-16};ProfessorA;XX-229","Database;Monday3,4{1-16};ProfessorB;XX-130","Human Computer Interaction;Monday5,6{1-8};ProfessorC;XX-130;;C Programming;Monday5,6{9-16};ProfessorC;XX-336",null,null,null]}
我想將它們分離並放入這樣的NSArray
(分離后):
Mon
Operation System;Monday 1,2{9-16};ProfessorA;XX-229
Database;Monday3,4{1-16};ProfessorB;XX-130
Human Computer Interaction;Monday5,6{1-8};ProfessorC;XX-130;;C Programming;Monday5,6{9-16};ProfessorC;XX-336
並將其分別顯示在TableViewCells
,我的正則表達式是這樣的:
[^\\"]
它可以完成工作,但還不夠好,因為這使其分成了單個字母而不是我想要的字符串。 有人知道嗎?
我已經看過評論,但對於為什么您確實需要通過reg-exp 手動解析它仍然感到有些困惑,即使您以字符串形式獲取它...
因此,我提出了這一點,它可能會很有用(如果不是對您有用,但是對於不想創建實際的reg-exp但希望對其進行一般解析的人):
NSString *_json = @"{\"Mon\":[\"Operation System;Monday 1,2{9-16};ProfessorA;XX-229\",\"Database;Monday3,4{1-16};ProfessorB;XX-130\",\"Human Computer Interaction;Monday5,6{1-8};ProfessorC;XX-130;;C Programming;Monday5,6{9-16};ProfessorC;XX-336\",null,null,null]}";
NSError *_error = nil;
id _jsonId = [NSJSONSerialization JSONObjectWithData:[_json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&_error];
那么您就可以實際使用這些值做任何事情,因為_jsonId
看起來像這樣:
{
Mon = (
"Operation System;Monday 1,2{9-16};ProfessorA;XX-229",
"Database;Monday3,4{1-16};ProfessorB;XX-130",
"Human Computer Interaction;Monday5,6{1-8};ProfessorC;XX-130;;C Programming;Monday5,6{9-16};ProfessorC;XX-336",
"<null>",
"<null>",
"<null>"
);
}
您可以手動提取值,例如:
NSArray *_keyMon = [_jsonId valueForKey:@"Mon"];
NSString *_value0 = [_keyMon objectAtIndex:0]; // Operation System;Monday 1,2{9-16};ProfessorA;XX-229
NSString *_value1 = [_keyMon objectAtIndex:1]; // Database;Monday3,4{1-16};ProfessorB;XX-130
NSString *_value1 = [_keyMon objectAtIndex:2]; // Human Computer Interaction;Monday5,6{1-8};ProfessorC;XX-130;;C Programming;Monday5,6{9-16};ProfessorC;XX-336
// 3, 4, etc...
NSString *_value5 = [_keyMon objectAtIndex:5];
哪些值可能需要進一步的后處理,才能用來分隔各個組件;
, 喜歡:
NSArray *_value0Components = [_value0 componentsSeparatedByString:@";"];
其中將包含:
(
"Operation System",
"Monday 1,2{9-16}",
"ProfessorA",
"XX-229"
)
等等...
您只需要匹配引號之間的文本( 編輯 : 將捕獲甚至是轉義的引號 ,測試包括\\\\\\"Monday
):
NSString *pattern = @"\"((?:[^\"\\\\]|\\\\.)*)\"";
這是一個示例代碼,可以幫助您進步:
NSError *error = nil;
NSString *pattern = @"\"((?:[^\"\\\\]|\\\\.)*)\"";
NSString *string = @"{\"Mon\":[\"Operation System;\\\"Monday 1,2{9-16};ProfessorA;XX-229\",\"Database;Monday3,4{1-16};ProfessorB;XX-130\",\"Human Computer Interaction;Monday5,6{1-8};ProfessorC;XX-130;;C Programming;Monday5,6{9-16};ProfessorC;XX-336\",null,null,null]}";
NSRange range = NSMakeRange(0, string.length);
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
NSArray *matches = [regex matchesInString:string options:0 range:range];
for (NSTextCheckingResult* match in matches) {
NSRange group1 = [match rangeAtIndex:1];
NSLog(@"group1: %@", [string substringWithRange:group1]);
}
演示程序輸出:
2015-05-14 08:45:37.906 main[33] group1: Mon
2015-05-14 08:45:37.908 main[33] group1: Operation System;\"Monday 1,2{9-16};ProfessorA;XX-229
2015-05-14 08:45:37.908 main[33] group1: Database;Monday3,4{1-16};ProfessorB;XX-130
2015-05-14 08:45:37.908 main[33] group1: Human Computer Interaction;Monday5,6{1-8};ProfessorC;XX-130;;C Programming;Monday5,6{9-16};ProfessorC;XX-336
對於我和其他人來說,這看起來都是完美的JSON。 試圖用正則表達式解析它是瘋狂的。 JSON將為您提供一個不錯的字典,在鍵“ Mon”下具有字符串數組和NSNull值。 您再也無法要求更好了。
(使用正則表達式的答案將無法處理轉義字符,將丟失數字,布爾值,空值並丟失結構,因此一旦獲得鍵“ Mon”和“ Tue”,就會卡住)。
實際上,對於當今的任何程序員來說,知道如何解析JSON都是絕對必須的,因此您最好習慣它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.