1

我在这个问题上停留了很长一段时间,我无法通过通常的谷歌搜索找到合适的解决方案。我正在尝试评估字符串的格式,更准确地说,我正在检查该字符串是否为加拿大邮政编码。

所以我从这个正则表达式开始,感谢有博客的极客

^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$

之后,我以这种方式创建了一个 NSRegularExpression 的实例:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$" options:NSRegularExpressionCaseInsensitive error:&error];

添加了用于转义的反斜杠。

然后我NSPredicate用正则表达式做了一个

NSPredicate *regextest = [NSPredicate
                          predicateWithFormat:@"SELF MATCHES[cd] %@", regex];

最后,我正在评估字符串本身

[regextest evaluateWithObject:@"G2G 2S2"]

在最后一行,抛出异常。

NSInvalidArgumentException 无法从对象创建正则表达式

NSRegularExpression: 0x81e1bb0 ^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[AZ]{1} *\d{1}[AZ]{1}\d{1}$ 0x1。

我想不通=/我用正则表达式测试器测试了正则表达式本身,这很好,从我用谷歌检查的结果来看,这就是应该如何进行字符串评估。我在这里迷路了。有人有想法吗?

4

2 回答 2

3

您应该直接[NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", pattern]在行中使用您的模式,而不是传递一个NSRegularExpression对象。

(此外,如果{1}不需要它们,您可以从正则表达式中删除它们。)

NSString* pattern = @"^[ABCEGHJKLMNPRSTVXY]\\d[A-Z] *\\d[A-Z]\\d$";
NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", pattern];

if ([regextest evaluateWithObject:@"G2G 2S2"]) ...

要在 iOS 上执行正则表达式,您可以使用NSPredicateclass 或 theNSRegularExpression但不能同时使用:

  • NSPredicate是一种简单的情况,您只需要检查是否找到匹配项。
  • NSRegularExpression更加完整,并允许您列出所有匹配项、它们在字符串中的位置、遍历所有匹配项、执行替换等。

如果你愿意,你可以NSRegularExpression这样使用:

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[ABCEGHJKLMNPRSTVXY]\\d[A-Z] *\\d[A-Z]\\d$" options:NSRegularExpressionCaseInsensitive error:&error];
NSUInteger nbFound = [regex numberOfMatchesInString:@"G2G 2S2" options:0 range:NSMakeRange(0,7)];
if (nbFound > 0) ...

但是由于您只想检查字符串是否与模式匹配,并且不需要更多信息(您不需要找到的字符串的范围,也不需要从找到的字符串中进行替换或提取子表达式等),NSPredicate所以足以满足您的使用需求,并且对于简单的“是/否”测试也应该更有效。

于 2012-09-19T14:34:42.573 回答
2

NSPredicate模式中只是一个字符串,所以这将起作用:

NSString *pattern = @"^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$";

NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", pattern];

BOOL result = [regextest evaluateWithObject:@"G2G 2S2"];

哦,我同意{1}应该删除 -parts - 它们只会增加混乱。

于 2012-09-19T14:34:21.630 回答