簡體   English   中英

Obj-c使用正則表達式用雙引號分隔字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM