正则表达式复制输出".*"?



代码:

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;
}

为什么".*"正则表达式将"foo"替换为"barbar"而不是"bar"?

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

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

对ruakh的答案进行一点扩展,是一个类似的SO问题,它给出了更多的"为什么"答案:

why-does-year-2010-4-results-in-empty-string-in-1

最新更新