2017-02-11 88 views
1

我想检查一个字符串是否是P.O.框。我用两个不同的Web浏览器测试了我的正则表达式字符串,它工作得很好。当我如图所示使用它时,我无法获得比赛。为什么这个正则表达式代码不适用于P.O.盒子串?

NSString *string = @"P.O. Box 123"; 
NSString *regexString = @"/\\b[P]\\W*?\\s*?\\.*?\\s*?[o]\\W?\\s*?\\.*?\\s*?(st|stal)?\\W*?\\s*?(box|office) /igm"; 
NSError *error = nil; 
NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:regexString options:NSRegularExpressionCaseInsensitive error:&error]; 
NSRange range = NSMakeRange(0, string.length); 
if ([expression numberOfMatchesInString:string options:0 range:range] > 0) { 
    NSLog(@"Matches"); 
} 
+0

什么手段在年底'/ igm'?不区分大小写,全局和多行?去掉它。 – Larme

回答

1

您应该从字符串模式除去正则表达式分隔符和选项。 m修饰符是没有必要的,因为您没有^$锚内部,并且g修饰符默认与numberOfMatchesInString一起使用。

使用

NSString *regexString = @"\\b[P]\\W*?\\s*?\\.*?\\s*?[o]\\W?\\s*?\\.*?\\s*?(st|stal)?\\W*?\\s*?(box|office) "; 

还要注意的是这里大多数情况下,你可能会贪心的孩子代替懒惰量词。 \W*?\s*?可以成功合并为\W*,因为\W也与空格匹配。例如。这将工作,太:

NSString *regexString = @"\\bP\\W*o\\W?\\s*\\.*\\s*(st|stal)?\\W*(box|office) "; 

online Objective-C demo

+0

非常感谢!太棒了! –

相关问题