1

我有一个可以与RegExr一起使用的正则表达式,但不能与 Objective-C 中的 NSRegularExpression 一起使用。问题在于 " 和 } 符号,这是我要搜索的字符串的一部分。我的正则表达式:

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

有了这个表达式,Xcode 说“预期:”,并且在 } 前面加上 \,Xcode 也说它不识别 }。我让所有这些变体都可以与 RegExr 一起使用。

对于这样的字符串:

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

我查阅了文档,但没有找到关于这些符号的任何信息。

我的代码是:

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 是问题所在?

提前致谢。

4

2 回答 2

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

于 2013-07-04T14:10:38.657 回答
1

您的模式应如下所示:

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

由于"用作 的分隔符,因此NSString您必须对它们进行转义(即在字符串中的\all 之前添加 a )。"

编辑:正如 MartinR 在评论中指出的那样,您还需}要用两个斜杠转义\\,因为它是正则表达式中的特殊字符。

这应该通过语法着色非常清楚地显示:

代码语法着色

完整代码:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=\"Here\":\")(.*?)(?=\"})"
                                                                   options:NSRegularExpressionCaseInsensitive // or whatever options you want to use
                                                                     error:&error];
于 2013-07-04T13:20:51.923 回答