2012-02-14 178 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