【问题标题】:NSRegularExpression does not seem to recognize the symbols " and } in expressionNSRegularExpression 似乎无法识别表达式中的符号 " 和 }
【发布时间】:2013-07-04 23:20:28
【问题描述】:

我有一个正则表达式适用于 RegExr,但不适用于 Objective-C 中的 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 是问题所在?

提前致谢。

【问题讨论】:

  • 您似乎正在尝试解析哈希表或字典的字符串表示形式。你确定没有更适合的库吗?
  • 是的,它看起来像 JSON,所以可以使用 NSJSONSerialization。
  • 是的,它是 JSON。多亏了你们两个,我也要检查那个选项,因为它可能更有效。 ;)

标签: objective-c regex nsregularexpression


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你的模式应该是这样的:

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

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

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

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

    完整代码:

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

    【讨论】:

    • 我在 Objective-C 和 RegExr 中逃脱了它们,但遗憾的是它只在后者中有效。感谢您的建议,我已经用“转义”表达式更新了问题。
    • } 字符必须在正则表达式中进行转义(并在 NSString 中进行双重转义:@"...\\}...")。
    • 啊,给你! \\} 在最后。谢谢你们!
    • @GuillaumeAlgis:也许您也可以在“完整代码”示例中修复它。
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多