2012-09-19 49 views
1

我困住了這個問題很長一段時間了,我無法找出一個正常的解決方案,與通常的谷歌搜索。我試圖評估一個字符串的格式,更確切地說,我正在檢查字符串是否是加拿大郵政編碼。麻煩正確評估一個字符串與NSRegularExpression和NSPredicate

於是我開始與此正則表達式,這要歸功於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}$" 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。

我無法弄清楚= /我測試了正則表達式本身就帶有regex tester和它的罰款,並從我與谷歌的檢查這是怎麼一個字符串評估應該做的。我迷失在這裏。任何人有想法?

+0

嘗試取出所有「'{1}」,因爲它們是不必要的。 –

+0

@ acheong87非常感謝這個建議,我試過了,不幸的是我仍然得到= /中拋出的異常,但是謝謝你的建議! –

回答

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} - 零件應該被刪除 - 它們只是添加混亂。

+0

謝謝!這工作!然而,現在我想知道爲什麼NSRegularExpression表演哈哈。但至少現在它起作用了。謝謝! –

+0

我在我的答案中詳細解釋了有關NSRegularExpression的內容;) – AliSoftware

+0

@Alisoftware謝謝!這是非常豐富的! –

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上進行正則表達式,你要麼使用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測試也應該更有效。