2

我有一个问题,我不明白如何做到这一点(6小时或谷歌搜索后)

我有一个名为“文件名”的字符串包含此文本:“Aachen-Merzbrück EDKA\r\r\nVerkehr”我想使用正则表达式来仅获取这部分“Aachen-Merzbrück EDKA”,但我不能......

这是我的代码:

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}

但是现在,如何从“Aachen-Merzbrück EDKA\r\r\nVerkehr”中只获得这个“Aachen-Merzbrück”EDKA

我的 NSRegularExpression 正则表达式返回给我相同的字符串....

4

2 回答 2

0

您的问题中有几个问题:

  1. 无需匹配城市名称字符 - 周围总是有奇怪的字符(连字符、撇号等)。您可以将文本中的第一“行”与国际民航组织代码的测试相匹配,作为额外的安全措施。
  2. 使用stringByReplacingMatchesInString:您实际上删除了您想要保留的机场名称(和 ICAO 代码) 。
  3. stringByReplacingMatchesInString:是一个 hacky(因为它会删除东西,所以你需要让你的正则表达式“否定”)快捷方式,有时可以工作(我自己使用它)但它可能会混淆事情 - 以及未来的读者。

话虽如此,一些更改将解决它:

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];
于 2013-10-08T15:22:55.657 回答
0

谢谢它很好用,但我用这个,它在我的情况下更好用:

NSString *expression = @"\\S+\\s+[A-Z]{4}";
于 2013-10-09T08:55:10.990 回答