NSRegularExpression只获取正则表达式

时间:2013-10-08 14:27:39

标签: objective-c nsregularexpression

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

我有一个名为“filename”的字符串包含这个文字:“Aachen-MerzbrückEDKA\ r \ n \ r \ nVerkehr” 我想用正则表达式只获得这部分“Aachen-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 + [A-Z] {4}

但是现在,如何从“Aachen-MerzbrückEDKA\ r \ n \ r \ nVerkehr”获得“Aachen-Merzbrück”EDKA

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

2 个答案:

答案 0 :(得分:0)

您的问题中有几个问题:

  1. 无需匹配城市名称字符 - 周围总是有奇怪的字符(连字符,撇号等)您可以将文本中的第一个“行”与ICAO代码的测试作为额外的安全性进行匹配。 / LI>
  2. 使用stringByReplacingMatchesInString:您实际删除您希望保留的机场名称(以及ICAO代码)。
  3. stringByReplacingMatchesInString:是一个hacky(因为它删除了东西,所以你需要让你的正则表达式“消极”)有时可行的快捷方式(我自己使用它),但这会让人感到困惑 - 以及未来的读者。
  4. 话虽如此,一些改变将解决它:

    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];
    

答案 1 :(得分:0)

感谢它的良好工作,但我使用这个,在我的情况下它的工作更好:

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