2012-07-07 19 views
2

我今天正在修補Objective-C,但我遇到了一些奇怪的行爲。基本上我試圖從NSString中替換所有非字母小寫字符。我已基本歸結爲:[NSRegularExpression stringByReplacingMatchesInString]意外的行爲

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
    NSError *error; 
    NSRegularExpression *pattern = [[NSRegularExpression alloc] initWithPattern:@"/[^abcdefghijklmnopqrstuvwxyz]/" options:0 error:&error]; 
    NSString *replacableStuff = @"a b c\nd e"; 
    NSLog(@"%@", [pattern stringByReplacingMatchesInString:replacableStuff options:0 range:NSMakeRange(0, [replacableStuff length]) withTemplate:@""]); 

    } 
    return 0; 
} 

然而,更換似乎從來沒有發生;運行此日誌「a b c \ nd e」到日誌thingie。 (我期待看到「abcde」)。我嘗試了更簡單的模式,如/[aeiou]/甚至只是/a/,但無論我嘗試什麼,stringByReplacingMatchesInString方法似乎都不會取代任何內容。我忽略了什麼?

回答

2

您需要刪除圖案兩側的斜槓。斜槓不是可可的正則表達式中的元字符,所以當前表達式匹配的字符串將是單個字母,兩邊都是斜線 - /a//b/,/c/,依此類推。

你也可以在你的字符類使用範圍,像這樣:

NSRegularExpression *pattern = [[NSRegularExpression alloc] initWithPattern:@"[^a-z]" options:0 error:&error]; 
+0

啊哈!就是這樣。當然,現在我覺得自己就像一個doofus,因爲在我看到的所有例子中都沒有注意到這一點。謝謝!至於範圍的東西,我瞭解到 - [在這個網站上](實際上) - (http://stackoverflow.com/questions/1930487/will-az-ever-match-accented-characters-in-preg-pcre)當涉及到PHP的PCRE庫時,字母範圍可以根據系統區域設置匹配不同的字母,所以我習慣於在可能存在歧義時寫出它們。這是我不需要擔心與NSRegularExpression? – 2012-07-07 12:20:44

+1

@GarrettAlbright關於範圍依賴於編碼是一個很好的觀點。但是,在Objective C程序運行的環境中(mac和ios設備),您沒有機會觸及非正統編碼,而拉丁字母的字母未安排在連續的塊中。 – dasblinkenlight 2012-07-07 12:36:01