我有一个问题,我不知道如何做到这一点(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正则表达式返回相同的字符串....
答案 0 :(得分:0)
您的问题中有几个问题:
stringByReplacingMatchesInString:
您实际删除您希望保留的机场名称(以及ICAO代码)。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];
答案 1 :(得分:0)
感谢它的良好工作,但我使用这个,在我的情况下它的工作更好:
NSString *expression = @"\\S+\\s+[A-Z]{4}";