为什么NSRegularExpression说“a”字符串中有两个“。*”匹配?

时间:2011-07-27 20:11:09

标签: objective-c regex cocoa macos

我很高兴Lion引入了NSRegularExpression,但我无法理解为什么模式.*匹配像“a”这样的字符串中的两个匹配项(文本可以更长)。

我正在使用以下代码:

NSError *anError = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@".*"
                                                                       options:0
                                                                         error:&anError];
NSString *text = @"a";
NSUInteger counter = [regex numberOfMatchesInString:text
                                            options:0
                                              range:NSMakeRange(0, [text length])];

NSLog([NSString stringWithFormat:@"counter = %u", counter]);

控制台的输出是:

  

2011-07-27 22:03:27.689 Regex [1930:707] counter = 2

任何人都可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:6)

正则表达式.*匹配零个或多个个字符。因此,它将匹配空字符串以及a,因此有两个匹配。

答案 1 :(得分:2)

轻微的惊讶,它没有匹配3次。一个用于“a”之前的“”,一个用于“a”,一个用于“a”之后的“”。

正如已经指出的那样,使用更精确的模式;包括锚点(^和/或$)也可能会改变行为。

没有人问过,但你为什么要这样做呢?

答案 2 :(得分:1)

NSRegularExpression上的documents说出以下内容:

  

一些正则表达式[...]可以   成功匹配零长度范围,所以比较了   结果范围{NSNotFound,0}是最可靠的方法   确定是否有匹配。

我更可靠地获得一场比赛的方法是将表达式更改为.+