2013-07-04 53 views
1

我有一個與RegExr一起使用的正則表達式,但在Objective-C中無法與NSRegularExpression一起使用。問題出在」和}符號上,這是一個我想要搜索的字符串的一部分。 我的正則表達式:NSRegularExpression似乎無法識別表達式中的符號「和}

(?<=\"Here\":\")(.*?)(?=\"}) 

有了這個表達,Xcode中說「期望」,並與\前面}和Xcode中還表示,它不承認}。我得到所有這些變化與RegExr一起工作。

對於這樣的字符串:

{"Something":"Something else", "Here" : "What I want is between these quotation marks"} 

我在documentation擡頭,但我沒有找到有關這些符號有什麼。

我的代碼是:

NSRegularExpression *regEx = [NSRegularExpression regularExpressionWithPattern:@"(?<=\"Here\":\")(.*?)(?=\"})"options:NSRegularExpressionCaseInsensitive error:&error]; 
NSArray *matches = [regEx matchesInString:stringToSearch options:0 range:NSMakeRange(0, [stringToSearch length])]; 
[matches count] // Returns 0 

那麼,是我的錯?也許所有的表達都是錯誤的,RegExr是問題嗎?

在此先感謝。

+3

它看起來像你試圖解析一個哈希表或字典的字符串表示。你確定沒有更好的圖書館嗎? – Monolo

+1

是的,看起來像JSON,所以可以使用NSJSONSerialization。 –

+0

是的,它是JSON。感謝你們兩位,我也會檢查這個選項,因爲它可能更有效。 ;) – Esso

回答

1

你的模式應該看起來是這樣的:

@"(?<=\"Here\":\")(.*?)(?=\"\\})" 

由於"作爲分隔符爲NSString,你必須轉義(即加在字符串\之前的所有")。

編輯:由於MartinR在評論中指出,還需要躲避}兩個斜線\\,因爲它是在正則表達式特殊字符。

這應該與語法着色很清楚地顯示:

code syntax colored

完整代碼:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=\"Here\":\")(.*?)(?=\"})" 
                    options:NSRegularExpressionCaseInsensitive // or whatever options you want to use 
                    error:&error]; 
+0

我在Objective-C和RegExr中逃脫了它們,但遺憾的是它只能在後者中運行。感謝您的建議,我已經用「轉義」表達式更新了這個問題。 – Esso

+0

你能粘貼你正在編譯的確切代碼嗎? –

+2

'}'字符必須在正則表達式中轉義(並且在NSString中雙重轉義:'@「... \\} ...」')。 –

3

你應該只使用NSJSONSerialization解析您的JSON:

例如

NSData *data = ... // load your {"Something":"Something else", "Here" : "What I want is between these quotation marks"} 

NSError *error; 
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 
if (error) 
    NSLog(@"%s: JSONObjectWithData error: %@", __FUNCTION__, error); 

NSLog(@"value for Something: %@", dictionary[@"Something"]); 
NSLog(@"value for Here: %@", dictionary[@"Here"]); 

使用正則表達式來解析JSON將會固有地變得脆弱。例如,你顯然認爲JSON中冒號周圍沒有空格。但可能有(並且實際上,在你的例子中有)。同樣,假設「Here」的值是最後一項也是不明智的(因此,您可以查找引號,然後關閉大括號,而在將來的某個日期,可能會後跟逗號,而不是關閉支撐)。更糟糕的是,理論上可能(儘管極不可能)字符串值本身會有引號和右括號,因此您應該檢查未引號的引號。

雖然您可以修正正則表達式,但使用JSON解析器可以避免您必須將所有這些額外的邏輯構建到複雜的正則表達式中。