在 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 中使用正则表达式匹配方括号的主要内容,如果未能解决你的问题,请参考以下文章

day17-JavaScript正则表达式

在 C# 中使用正则表达式匹配 a^n b^n c^n(例如“aaabbbccc”)

如何在 Objective-C 中使用正则表达式验证 IP 地址?

c语言实现正则表达式匹配

详解 Python3 正则表达式

正则表达式:在C#中匹配引号[重复]