2011-06-27 3 views
1

私はobjective-cで多くの経験がありません。本当に明白な場合は、ごめんなさい。Objective-Cでトークン化NSStringを2回

私が必要とするのは、NSStringをトークンに分割することです。トークンはスペースまたは別の記号(文字ではない)で区切られます。キャッチは、区切り記号がスペースの場合を除き、区切り記号を保持したいということです。

フレーズ例: "a b c、d's、e f。"

"a" 
"b" 
"c" 
"," 
"d" 
"'" 
"s" 
"," 
"e" 
"f" 
"." 

このコードで:ここから私が取得したいと思い

NSMutableCharacterSet *separators = [NSMutableCharacterSet punctuationCharacterSet]; 
[separators formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

NSArray *parse_array = [intext componentsSeparatedByCharactersInSet:separators]; 

私は文字だけを取得します。空白とNLをフィルタリングするだけで、文字と一緒に記号が得られます。私が必要とするのは、最初に空白とNl、そして句読点の順に2つの解析を実行することですが、私は実際にそれをどのように目的関数で行うのか分かりません。誰も私にヒントを与えることができますか?

ありがとうございます!

答えて

3

さて、あなたは文字列からすべての空白を削除するには、このような何かを行うことができます:

NSArray * t = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
string = [t componentsJoinedByString:@""]; 

次に、あなただけの文字を反復処理するとNSStringsにそれらを回すことができる:

NSMutableArray *tokens = [NSMutableArray array]; 
for (NSUInteger i = 0; i < [string length]; ++i) { 
    unichar character = [string characterAtIndex:i]; 
    NSString *token = [NSString stringWithFormat:@"%C", character]; 
    [tokens addObject:token]; 
} 
NSLog(@"%@", tokens); 

か前に空白を取り除きたくない場合は、ループ内でそれを行うことができます:

NSMutableArray *tokens = [NSMutableArray array]; 
for (NSUInteger i = 0; i < [string length]; ++i) { 
    unichar character = [string characterAtIndex:i]; 
    if ([[NSCharacterSet whitespaceCharacterSet] characterIsMember:character]) { 
    continue; 
    } 
    NSString *token = [NSString stringWithFormat:@"%C", character]; 
    [tokens addObject:token]; 
} 
NSLog(@"%@", tokens); 
+0

申し訳ありませんが、私の例文には手紙しかありませんでしたが、これを使用して単語も解析することが目的です。私はいくつかのバッファを追加し、解決策を適用します。ありがとうございました! –

0

私はこのコードで動作するようになった。これは文字や単語に対応します:

//parse the phrase into tokens. Punctuation will be tokenized too. 
NSMutableArray *tokens = [NSMutableArray array]; 
NSInteger last_word_start = -1; 
// 
for (NSUInteger i = 0; i < [myPhrase length]; ++i) 
{ 
    unichar character = [myPhrase characterAtIndex:i]; 
    if ([[NSCharacterSet whitespaceCharacterSet] characterIsMember:character]) 
    { 
     if (last_word_start >= 0) 
      [tokens addObject:[myPhrase substringWithRange:NSMakeRange(last_word_start, i-last_word_start)]]; 
     last_word_start = -1; 
    } 
    else 
    { 
     if ([[NSCharacterSet punctuationCharacterSet] characterIsMember:character]) 
     { 
      if (last_word_start >= 0) 
       [tokens addObject:[myPhrase substringWithRange:NSMakeRange(last_word_start, i-last_word_start)]]; 
      [tokens addObject:[NSString stringWithFormat:@"%C", character]]; 
      last_word_start = -1; 
     } 
     else 
     { 
      if (last_word_start == -1) 
       last_word_start = i; 
     } 
    } 
} 
//save pending letters 
if (last_word_start >= 0) 
    [tokens addObject:[myPhrase substringWithRange:NSMakeRange(last_word_start, [myPhrase length]-last_word_start)]]; 
NSLog(@"Tokens for phrase '%@':",myPhrase); 
NSLog(@"%@", tokens); 

ありがとうございます!

5

ツールキットを解析/私のオープンソースココア文字列トークン化をチェックアウト:ParseKit:PKTokenizer

http://parsekit.com

ParseKitは非常に強力/柔軟トークナイザクラスが含まれています。既定では、PKTokenizerは、空白でトークンを消費せず、空白トークンを報告しません。 (あなたが欲しいものですが、そうでない場合は、その動作を設定することができます。この場合。)

は、ここでは、この特定のタスクのためPKTokenizerを使用することができます方法は次のとおりです。

// create the tokenizer with your string 
NSString *inStr = @"a b c,d's, e f."; 
PKTokenizer *t = [PKTokenizer tokenizerWithString:inStr]; 

// configure the tokenizer to not allow apostrophes inside words (that's the default) 
[t.wordState setWordChars:NO from:'\'' to:'\'']; 

// loop thru the input and concat the non-whitespace chars 
PKToken *eof = [PKToken EOFToken]; 
PKToken *tok = nil; 

NSMutableArray *outStrs = [NSMutableArray array]; 
while ((tok = [t nextToken]) != eof) { 
    [outStrs addObject:tok.stringValue]; 
} 

outStrsは含まれています

"" "B" "C" "" "D" """ "S" "、 " "e" "f" "。"

この特定のタスクでは、ParseKitが多少過度に機能するかもしれません。しかし、あなたがいくつかの似たような仕事をしているなら、あなたの時間/苦痛を節約するかもしれないので、おそらくチェックアウトする価値があります。

関連する問題