在 Objective C 中使用正则表达式匹配方括号
Posted
技术标签:
【中文标题】在 Objective C 中使用正则表达式匹配方括号【英文标题】:Matching Square Brackets with a Regular Expression in Objective C 【发布时间】:2012-10-26 12:10:42 【问题描述】:我在 Stack Overflow 或 Google 上找不到任何专门解决如何在谓词中找到方括号的内容,所以我想我会在这里发布它,看看是否有人可以解释解决方案。
NSString *mstr = @"fasd[981db7007771ffa3]dfaads";
NSString *test =@".*\\[[0-9,a-f]16\\].*";
//NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES '.*\\\\[[0-9,a-f]16\\\\].*'"]; //works
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", test];
if ([pred evaluateWithObject:mstr])
NSLog(@"Yes");
似乎在转义括号时,您需要四个反斜杠,但如果将它放在一个字符串中,则只需要两个。不清楚为什么会这样。
【问题讨论】:
【参考方案1】:原因是因为NSPredicate
自己的反斜杠转义以及 C 编译器的转义。那么,让我们来看看首先完成的步骤:
来源:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"\\\\[(regex here)\\\\]"];
C 预编译器:(转义一组反斜杠)
NSPredicate *pred = [NSPredicate predicateWithFormat:@"\\[(regex here)\\]"];
NSPredicate 内部编译器:(取消第二组反斜杠,并编译正则表达式)。
NSPredicate *pred = [NSPredicate predicateWithFormat:@"\[(regex here)\]"];
传入字符串字面量时,先由NSPredicate
编译,而传入变量时,编译方式不同(跳过转义部分)。
【讨论】:
这是有道理的,并且与我在代码中更改正则表达式时看到的相符。以上是关于在 Objective C 中使用正则表达式匹配方括号的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中使用正则表达式匹配 a^n b^n c^n(例如“aaabbbccc”)