2011-07-29 14 views
8

私はこのような文字列トークナイザ作成しました:CFStringTokenizerを使用して文の配列を取得する方法は?

stringTokenizer = CFStringTokenizerCreate(
         NULL 
         , (CFStringRef)str 
         , CFRangeMake(0, [str length]) 
         , kCFStringTokenizerUnitSentence 
         , userLocale); 

をしかし、どのように、私はトークナイザから、今、それらの文章を取得するのですか? CF String Programming Guideには、CFStringTokenizerまたはトークンは記載されていません(PDF内の全文検索を行いました)。ここで

答えて

16

CFStringTokenizer使い方の例です:

CFStringRef string; // Get string from somewhere 
CFLocaleRef locale = CFLocaleCopyCurrent(); 

CFStringTokenizerRef tokenizer = 
    CFStringTokenizerCreate(
     kCFAllocatorDefault 
     , string 
     , CFRangeMake(0, CFStringGetLength(string)) 
     , kCFStringTokenizerUnitSentence 
     , locale); 

CFStringTokenizerTokenType tokenType = kCFStringTokenizerTokenNone; 
unsigned tokensFound = 0; 

while(kCFStringTokenizerTokenNone != 
    (tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer))) { 
    CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer); 
    CFStringRef tokenValue = 
     CFStringCreateWithSubstring(
      kCFAllocatorDefault 
      , string 
      , tokenRange); 

    // Do something with the token 
    CFShow(tokenValue); 
    CFRelease(tokenValue); 
    ++tokensFound; 
} 

// Clean up 
CFRelease(tokenizer); 
CFRelease(locale); 
+0

はどうもありがとうございました! – openfrog

+5

+1。 Foundationソリューションはもう少し強力ですが、より高いレベルの[NSString enumerateSubstringsInRange:options:usingBlock:]をオプション 'NSStringEnumerationBySentences'とともに使用することも可能です。たとえば、 'CFStringTokenizerCreate'を使用して任意のロケールを指定できますが、' enumerateSubstringsInRange:options:usingBlock: 'は現在のユーザーロケールを使用します。 –

0

また、使用することができます:

[mutstri enumerateSubstringsInRange:NSMakeRange(0, [mutstri length]) 
           options:NSStringEnumerationBySentences 
          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){ 

           NSLog(@"%@", substring); 

          }]; 
関連する問題