2013-02-23 117 views
-1

我正在尝试使用以下模式。iOS中的正则表达式问题

NSError *error = nil; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#{{[[[0-9]{1,10}-[0-9]{1,10}-[0-9]{1,10}]]}}" options:0 error:&error]; 
NSString *originalMesssage = @"test #{{[[8-16-5]]}}"; 
NSArray *arrResults = [regex matchesInString:originalMesssage options:NSRegularExpressionCaseInsensitive 
             range:NSMakeRange(0, [originalMesssage length])]; 

我想用上面的正则表达式过滤后的“8-16-5”作为返回值。显然问题出在“{}”&“[]”字符。 我测试了与http://regexpal.com/相同的模式,它在那里工作得很好。 1)有没有通配符,我应该在我的上面的代码中使用?

参考文献:NSRegularExpression

以下是其最终为我工作的代码。

NSError *error = nil; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#\\{\\{\\[\\[[0-9]{1,10}-[0-9]{1,10}-[0-9]{1,10}\\]\\]\\}\\}" options:0 error:&error]; 
NSString *originalMesssage = @"test #{{[[8-16-5]]}}"; 
NSArray *arrResults = [regex matchesInString:originalMesssage options:NSRegularExpressionCaseInsensitive 
             range:NSMakeRange(0, [originalMesssage length])]; 


NSTextCheckingResult *match = [arrResults objectAtIndex:0]; 
NSRange matchRange = [match range]; 
NSString *resultString = [originalMesssage substringWithRange:matchRange]; 
+0

请列出你目前的结果,而不是只是说“问题”。 – 2013-02-23 18:41:48

+0

我在使用此代码后出现以下错误: Error Domain = NSCocoaErrorDomain Code = 2048“The operation could not be completed。(Cocoa error 2048.)”UserInfo = 0xa3529a0 {NSInvalidValue =#{{[[[0-9] {1,10} - [0-9] {1,10} - [0-9] {1,10}]]}}} – user130934 2013-02-23 18:44:02

+0

@MikeM我想他可能只是英语不好......他可能是指他想要从字符串中返回“8-16-5”(所以RegEx去掉其他所有内容) – 2013-02-23 18:45:42

回答

3

[]{}字符在正则表达式特殊的含义。你需要逃避它们:

NSError *error = nil; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\#\\{\\{\\[\\[[0-9]{1,10}-[0-9]{1,10}-[0-9]{1,10}\\]\\]\\}\\}" options:0 error:&error]; 
NSString *originalMesssage = @"test #{{[[8-16-5]]}}"; 
NSArray *arrResults = [regex matchesInString:originalMesssage options:NSRegularExpressionCaseInsensitive 
             range:NSMakeRange(0, [originalMesssage length])];
+1

实际上应该使用双反斜杠“\\”,以便生成的字符串在每个转义字符前都有一个反斜杠。 C/Obj-C中字符串文字中的单反斜杠将会逃避跟随它们的字符,但我们希望反斜线能够在模式字符串中存活,以便正则表达式引擎知道应该转义的内容。 – warrenm 2013-02-23 18:53:11

+0

@warrenm是的,加入“\\”而不是“\”为我工作。 谢谢。 – user130934 2013-02-23 19:02:57

+0

你是对的@warrenm,我更新了答案。 – Aleph7 2013-02-23 19:08:49