2012-02-14 91 views
1

代码: “*”“。*”正则表达式重复输出?

static NSString* regexReplace(NSString* regexString, NSString* subject, NSString* replacement) 
{ 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexString options:0 error:nil]; 
    return [regex stringByReplacingMatchesInString:subject options:0 range:NSMakeRange(0, [subject length]) withTemplate:replacement]; 
} 
int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool 
    { 

     NSLog(@"%@", regexReplace(@".*", @"foo", @"bar")); //Output: barbar 
     NSLog(@"%@", regexReplace(@".+", @"foo", @"bar")); //Output: bar 

    } 
    return 0; 
} 

为什么正则表达式替换,而不是 '酒吧' '富' 与 'BARBAR'?

回答

5

因为它匹配两次:首先匹配"foo"部分,然后匹配"foo"末尾的空的""

(你甚至可以想象它会匹配无限次数,产生"barbarbarbar...",但是正则表达式引擎被设计为在继续之前只产生一个空串匹配,以避免这种无限循环。)

+0

是否有任何其他的正则表达式引擎这样做呢?它根本就不合逻辑。 – Tyilo 2012-02-14 02:34:06

+0

@Tyilo显然是的。我刚刚尝试http://www.regextester.com/并得到相同的结果。 – 2012-02-14 02:39:10

+1

那么,Perl,Java,JavaScript等等都做同样的事情,但我不知道他们是否算作“其他正则表达式引擎”(因为他们的正则表达式实现都非常密切相关)。不*这样做的一个正则表达式引擎是'sed'; 'sed's/a */b/g''会将'x'映射到'bxb',但'a'只映射到'b',而不是'bb'。如果您还有其他正则表达式引擎,请试试看! – ruakh 2012-02-14 02:42:40