5

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

-(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. 
}
4

4 に答える 4

20

文字列内の単語を列挙するには、-[NSString enumerateSubstringsInRange:options:usingBlock:]withNSStringEnumerationByWordsとを使用する必要がありNSStringEnumerationLocalizedます。リストされている他のすべての方法は、ロケールに適していないか、システム定義に対応していない可能性のある単語を識別する手段を使用します。たとえば、空白ではなくコンマで区切られた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]

于 2012-06-23T18:15:31.953 に答える
1

正規表現を使用して条件を記述できる場合は、正規表現のマッチングを実行してこれらの単語をフェッチし、convert:メソッドに渡すことができます。

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

お役に立てれば。

于 2012-06-23T16:33:49.820 に答える
1

あなたのために働く配列をループすることについて私が知っている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];
}];

もう1つの方法は–makeObjectsPerformSelector:withObject:、機能しません。それは[word method:obj]あなたが期待するものから逆に電話をかけることができることを期待しています。

于 2012-06-23T16:48:47.783 に答える
-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);

このコードはかなりラフなので、おそらく書き直す必要がありますが、あなたはその考えを理解する必要があります。

編集:ジェイコブ・ゴーバンの投稿を見たばかりです。間違いなくそのようにする必要があります。

于 2012-06-23T16:34:46.713 に答える