为什么这个正则表达式代码不能用于P.O.盒子串?

时间:2017-02-11 22:51:54

标签: ios objective-c regex

我正在尝试检查字符串是否是P.O.框。我用2种不同的Web浏览器测试了我的Regex字符串,它运行得很好。当我按照所示使用它时,我无法得到匹配。

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");
}

1 个答案:

答案 0 :(得分: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