Objective c NSRegularExpression似乎无法识别这些符号;表达式中的}

Objective c NSRegularExpression似乎无法识别这些符号;表达式中的},objective-c,regex,nsregularexpression,Objective C,Regex,Nsregularexpression,我有一个可以使用的正则表达式,但在Objective-C中不能使用NSRegularExpression。问题在于“and}符号,这是我要搜索的字符串的一部分。 我的正则表达式: (?<=\"Here\":\")(.*?)(?=\"}) 我在地图上查了一下,但没有找到任何关于这些符号的东西 我的代码是: NSRegularExpression *regEx = [NSRegularExpression regularExpressionWithPattern:@"(?<=\"Her

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

(?<=\"Here\":\")(.*?)(?=\"})
我在地图上查了一下,但没有找到任何关于这些符号的东西

我的代码是:

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

NSRegularExpression*regEx=[NSRegularExpression regular expressionwithpattern:@”(?您的模式应该如下所示:

{"Something":"Something else", "Here" : "What I want is between these quotation marks"}
@"(?<=\"Here\":\")(.*?)(?=\"\\})"

您的模式应该如下所示:

{"Something":"Something else", "Here" : "What I want is between these quotation marks"}
@"(?<=\"Here\":\")(.*?)(?=\"\\})"

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

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

我在Objective-C和RegExr中对它们进行了转义,但遗憾的是,它只在后者中起作用。感谢您的建议,我用“转义”更新了问题表达式。
}
字符必须在正则表达式中转义(并在NSString中进行双转义:
@“…\\}…”
)。啊,终于到了。\\}多亏了你们两位。@GuillaumeAlgis:也许你们也可以在“完整代码”中修复它例如,我在Objective-C和RegExr中对它们进行了转义,但遗憾的是,它只在后者中起作用。感谢您的建议,我已经用“转义”表达式更新了这个问题。
}
字符必须在正则表达式中转义(并且在NSString中进行双转义:
@…\\\}…
).啊,你来了!\}在最后。谢谢你们两个!@GuillaumeAlgis:也许你也可以在“完整代码”中修复它示例。看起来您正在尝试解析哈希表或字典的字符串表示形式。您确定没有更适合此功能的库吗?是的,它看起来像JSON,因此可以使用NSJSONSerialization。是的,它是JSON。多亏了你们两位,我也要检查该选项,因为它可能更有效。;)看起来您正在尝试解析哈希表或字典的字符串表示形式。您确定没有更适合这种情况的库吗?是的,它看起来像JSON,因此可以使用NSJSONSerialization。是的,它是JSON。多亏了你们两位,我也要检查该选项,因为它可能更有效。;)