objective-c - 使用 NSRegularExpression 和 NSPredicate 正确评估字符串时遇到问题

标签 objective-c regex cocoa

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

所以我从这个正则表达式开始,感谢 geeks with blogs

^[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}$"选项:NSRegularExpressionCaseInsensitive 错误:&error];

添加反斜杠用于转义。

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

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

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

[regextest evaluateWithObject:@"G2G 2S2"]

在最后一行,抛出异常。

NSInvalidArgumentException Can't create a regex expression from object

NSRegularExpression: 0x81e1bb0 ^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$ 0x1.

我无法弄清楚=/我用 regex tester 测试了正则表达式本身没关系,根据我与谷歌的检查,这就是字符串评估应该如何完成的。我在这里迷路了。大家有什么想法吗?

最佳答案

您应该直接在 [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 上执行正则表达式,您可以使用 NSPredicate 类或 NSRegularExpression,但不能同时使用两者:

  • 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 足以满足您的使用,并且对于简单的 YES/NO 测试也应该更有效。

关于objective-c - 使用 NSRegularExpression 和 NSPredicate 正确评估字符串时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12496652/

相关文章:

ios - UILabel 的 TextAlignment

ios - 保持 ScrollView 外的区域也可滚动

javascript - 如何在正则表达式构造函数中应用单词边界?

javascript - 使用 JavaScript 舍入表单中的用户输入

cocoa :分割 View 的奇怪紫色约束

objective-c - NSString 中子字符串的出现次数?

objective-c - cocoa NSView 模糊背景

ios - 在 iOS 中旋转视频与任何播放器完全兼容

java - 需要 REGEX 帮助 - 分解行

cocoa - 在 Cocoa 中如何从这个可变数组更新 NSTableView ?