2013-10-08 47 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