2012-06-23 16 views
5

NSStringをループして、特定の基準を持つすべての単語に対してカスタム関数を呼び出したいとします(たとえば、 "has 2 'L's")。私はそれに近づく最善の方法が何か不思議だった。検索/置換パターンを使用する必要がありますか?ブロック?NSString内のすべての単語のメソッドを呼び出す

-(NSString *)convert:(NSString *)wordToConvert{ 
    /// This I have already written 
    Return finalWord; 
} 

-(NSString *) method:(NSString *) sentenceContainingWords{ 
    // match every word that meets the criteria (for example the 2Ls) and replace it with what convert: does. 
} 

答えて

2

2つの方法があります。

NSArray *words = [sentence componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

for (NSString *word in words) 
{ 
    NSString *transformedWord = [obj method:word]; 
} 

NSArray *words = [sentence componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

[words enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id word, NSUInteger idx, BOOL *stop){ 
    NSString *transformedWord = [obj method:word]; 
}]; 

他の方法、–makeObjectsPerformSelector:withObject:

は、あなたのために動作しません。 [word method:obj]に電話することができますが、これはあなたが期待しているものとは逆です。

+0

中国語、日本語、ドイツ語のようないくつかの言語では、空白は単語間の明白なリミッターではないため、ケンのアプローチが適切です。 – Krodak

1

あなたは正規表現を使用して基準を書くことができれば、あなたはおそらく、これらの単語を取得してからconvert:メソッドに渡すために正規表現マッチングを行うことができます。

また、componentsSeparatedByString:またはcomponentsSeparatedByCharactersInSet:を使用して文字列を分割した後、配列内の単語を調べて、何らかの基準に一致するかどうかを検出することもできます。適合している場合は、convert:に渡してください。

これが役に立ちます。

-1

whileループを使用してこのような文字列を処理することをお勧めします。

NSRange spaceRange = [sentenceContainingWords rangeOfString:@" "]; 
NSRange previousRange = (NSRange){0,0}; 
do { 
    NSString *wordString; 
    wordString = [sentenceContainingWord substringWithRange:(NSRange){previousRange.location+1,(spaceRange.location-1)-(previousRange.location+1)}]; 
    //use the +1's to not include the spaces in the strings 
    [self convert:wordString]; 
    previousRange = spaceRange; 
    spaceRange = [sentenceContainingWords rangeOfString:@" "]; 
} while(spaceRange.location != NSNotFound); 

このコードは、かなり荒いので、書き直す必要があるかもしれませんが、あなたはそのアイデアを得るべきです。

編集:Jacob Gorbanの投稿を見ただけで、間違いなくそのようにする必要があります。次のように私はあなたのために働くだろう配列をループするの知っている

18

文字列内の単語を列挙するには、NSStringEnumerationByWordsNSStringEnumerationLocalizedを使用して、-[NSString enumerateSubstringsInRange:options:usingBlock:]を使用する必要があります。リストされている他のすべての方法は、ロケールに適していないかシステム定義に対応している単語を識別する手段を使用します。たとえば、空白ではなくカンマで区切られた2つの単語(たとえば「foo、bar」)は、他の回答によって別々の単語として扱われることはありませんが、Cocoaのテキストビューにあります。

[aString enumerateSubstringsInRange:NSMakeRange(0, [aString length]) 
          options:NSStringEnumerationByWords | NSStringEnumerationLocalized 
         usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){ 
    if ([substring rangeOfString:@"ll" options:NSCaseInsensitiveSearch].location != NSNotFound) 
     /* do whatever */; 
}]; 

-enumerateSubstringsInRange:options:usingBlock:のために文書化として、あなたが変更可能な文字列でそれを呼び出す場合、あなたは安全にenclosingRangeを列挙されている文字列を変異させることができます。したがって、一致する単語を置き換える場合は、[aString replaceCharactersInRange:substringRange withString:replacementString]のようなものを使用できます。

関連する問題