2010-11-16 45 views
1

我正在潛心研究iOS開發,並且我仍然熟悉NSString對象。我現在需要計算字符串中非字母數字字符的數量。我想出了從字符串剝離非字母數字字符,然後從原始字符串的長度減去剝離字符串的長度,像這樣的一種方法......如何計算NSString對象中非字母數字字符的數量?

NSCharacterSet *nonalphanumericchars = [[NSCharacterSet alphanumericCharacterSet ] invertedSet]; 

NSString *trimmedString = [originalString stringByTrimmingCharactersInSet:nonalphanumericchars]; 

NSInteger numberOfNonAlphanumericChars = [originalString length] - [trimmedString length]; 

,但它不工作。計數始終爲零。如何計算NSString對象中非字母數字字符的數量?

非常感謝您的智慧!

回答

5

你的方法存在的問題是,你並沒有剝離人物,你正在修剪它們。這意味着只能刪除字符串匹配的字符(中間沒有任何字符)。

爲此,您可以迭代字符串並測試每個字符不是字母數字集的成員。例如:

NSString* theString = // assume this exists 
NSMutableCharacterSet* testCharSet = [[NSMutableCharacterSet alloc] init]; 
[testCharSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]]; 
[testCharSet formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; 
NSUInteger length = [theString length]; 
NSUInteger totalNonAlnumCharacters = length; 
for(NSUInteger i = 0; i < length; i++) { 
    if([testCharSet characterIsMember:[theString characterAtIndex:i]]) 
    totalNonAlnumCharacters--; 
} 
NSLog(@"Number of non-alphanumeric characters in string: %lu", (long int)totalNonAlnumCharacters); 
[testCharSet release]; 
+0

謝謝,傑森,我會試試看,但它看起來不錯。此外,謝謝你指出我所做的修剪錯誤。 – BeachRunnerFred 2010-11-16 05:08:07

+0

還有一個問題,佔空間呢?我寧願空間不算作非字母數字字符,即使我想是。我是NSCharacterSet類的新手,能否以某種方式向alnumCharSet對象添加空格字符? – BeachRunnerFred 2010-11-16 05:18:34

+0

我剛剛找到「whitespaceCharacterSet」,我認爲應該可以工作。我會嘗試一下,再次感謝。 – BeachRunnerFred 2010-11-16 05:20:00

-2
NSString *[email protected]"str56we90"; 
int count; 

for(int i=0;i<[str length];i++) 
{ 
    int str1=(int)[str characterAtIndex:i]; 
    NSString *temp=[NSString stringWithFormat:@"%C",str1]; 

    if(str1 >96 && str1 <123 || str1 >64 && str1 <91) 

     count=count +1; 
} 

int finalResult = [str length] - count; 

數將是你的最終結果。

+0

它對你有幫助嗎? – Swastik 2010-11-16 04:51:17

+0

嗨雪莉,我還沒有機會嘗試它呢。另外,我不是那個低估了你的迴應的人。不管是誰,都應該留下評論,說明原因,但我感謝你的時間。 – BeachRunnerFred 2010-11-16 05:07:27

+0

非ASCII字符呢?什麼是'臨時'? – 2010-11-16 12:09:14

2

既然你提到你stringByTrimmingCharactersInSet試了一下:,這可能是有趣地瞭解到,實際上是一種方式只與框架調用做到這一點。通過一些借用賈森

NSString* theString = // assume this exists 
NSMutableCharacterSet* testCharSet = [[NSMutableCharacterSet alloc] init]; 
[testCharSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]]; 
[testCharSet formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; 

設置代碼,那麼你可以拋棄for循環是這樣的:

NSArray *nonComp = [theString componentsSeparatedByCharactersInSet:testCharSet]; 

這將打破串除了在每一個地方發現從字符集一個字符的索引,創建剩餘部分的數組。然後,您可以使用鍵 - 值編碼到再總結所有的作品length屬性:

NSNumber *numberOfNonANChars = [nonComp valueForKeyPath:@"@sum.length"]; 

或代替,再次粘合在一起的碎片,計數長度:

NSUInteger nonANChars = [[nonComp componentsJoinedByString:@""] length]; 

但是:分裂這些組件將創建一個數組和字符串,這些數組和字符串在計數之後不需要 - 無意義的內存分配(componentJoinedByString同樣如此:)。並且使用valueForKeyPath:對於這個非常簡單的求和,似乎代價更高,然後迭代原始字符串。

該代碼可能更面向對象或更不容易出錯,但在這兩種情況下,性能都會比Jason的代碼差幾個數量級。因此,在這種情況下,優秀的舊for-loop將最大限度地濫用框架功能(因爲所使用的方法不適用於此目的)。

相關問題