2013-10-08 66 views
2

我有一個問題,我不如何已瞭解這樣做(6小時後或谷歌搜索)NSRegularExpression只獲得正則表達式

i'have一個名爲「文件名」 containt這個文本字符串:「亞琛MerzbrückEDKA \ r \ r \ nVerkehr」 我想用正則表達式來只得到這部分 「亞琛MerzbrückEDKA」,但我不能....

這裏我的代碼:

NSString *expression = @"\\w+\\s[A-Z]{4}"; 

NSError *error = NULL; 

NSRegularExpression *regex = [NSRegularExpression   regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:&error]; 

NSString *noAirportString = [regex stringByReplacingMatchesInString:filename options:0 range:NSMakeRange(0, [filename length]) withTemplate:@""]; 

編輯:

這個工作好: \ S + \ S + [AZ] {4}

但現在,如何從得到的只有這個 「亞琛Merzbrück」 EDKA 「亞琛MerzbrückEDKA \ r \ r \ nVerkehr」

我用正則表達式NSRegularExpression我回到相同的字符串....

+0

我不不相信字符類'\ w'將在連字符上匹配。 – vcsjones

+0

無差異: 的NSString *表達= @ 「\ W + \ S [A-Z] {4}」; – Jeffrey

+0

嘗試'@ 「\\ * \\ S [AZ] {4}?」'行 – vcsjones

回答

0

一對夫婦在你的問題的問題:

  1. 無需匹配城市名稱的字符 - 總有一些奇怪的人左右(連字符,撇號等)。您可以將文本中的第一個「行」與測試相匹配國際民航組織代碼作爲額外的安全。
  2. 使用stringByReplacingMatchesInString:你實際上刪除你想要的機場名稱(和國際民航組織代碼)保留
  3. stringByReplacingMatchesInString:是哈克(因爲它刪除的東西,所以你需要讓你的正則表達式「負」)的快捷方式,有時工作(我用它自己),但其風險令人困惑的事情 - 和未來的讀者。

說了這麼多,有幾個變化將解決這個問題:

NSString *filename = @"Aachen-Merzbrück EDKA\r\r\nVerkehr"; 

// Match anything from the beginning of the line up to a space and 4 upper case letters. 
NSString *expression = @"^.+\\s[A-Z]{4}$"; 

NSError *error = NULL; 

//Make sure^and $ match line endings, 
//and make it case sensitive (the default) to explicitly 
//match the 4 upper case characters of the ICAO code 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionAnchorsMatchLines error:&error]; 

NSArray *matches = [regex matchesInString:filename 
            options:0 
            range:NSMakeRange(0, [filename length])]; 

// Check that there _is_ a match before you continue 
if (matches.count == 0) { 
    // Error 
} 

NSRange airportNameRange = [[matches objectAtIndex: 0] range]; 
NSString *airportString = [filename substringWithRange: airportNameRange]; 
0

由於這是很好的工作,但我用這一個,它的工作在我的情況好轉:

NSString *expression = @"\\S+\\s+[A-Z]{4}"; 
+0

當然,有很多方法來構建正則表達式解決你的問題。不過請注意,您的正規表達式對於名稱中有空格的機場不會產生理想的結果,例如「施韋比施哈爾EDTY」,不提「肯尼迪KJFK」或名人的名字命名的其他機場 - 他們往往在其名稱中的空格。 – Monolo