2013-07-04 63 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解析器可以避免您必须将所有这些额外的逻辑构建到复杂的正则表达式中。