0

私の目的は、テキストフィールドからのユーザーの入力を分析し、ユーザーが記号を使用しているかどうかを確認することです。

たとえば、ユーザーの入力は「/ ardv / * k」であり、ユーザーが3つの記号を入力したことを示す変数が必要です。

NSRangeを使用して文字列を検索する方法がわかりません。これは、最初の出現が見つかるとすぐに停止するためです。

また、NSSetはcharacterAtIndexセレクターと互換性がありません。

isEqualTo:機能しませんでした。

これが私がしたことですが、可能であればこのコードをより簡単にする方法を知りたいです:

  ...
    NSString *testThisString = @"/ardv/*k";        
    NSCharacterSet *unknownFlags1 = [NSCharacterSet punctuationCharacterSet];
    NSCharacterSet *unknownFlags2 = [NSCharacterSet symbolCharacterSet];
    NSCharacterSet *unknownFlags3 = [NSCharacterSet whitespaceCharacterSet];

    int count = 0;
    for (int i = 0; i < [testThisString length]; i++) {
    if ([unknownFlags1 characterIsMember:[testThisString characterAtIndex:i]] |
   [unknownFlags2 characterIsMember:[testThisString characterAtIndex:i]] | 
   [unknownFlags3 characterIsMember:[testThisString characterAtIndex:i]]) {
        count++;
    }
}
    NSLog(@"There are %d unknowns", count);
  ...
4

3 に答える 3

2

文字列にセットに属する文字が含まれているかどうかを確認するには、次のようにします。

NSString *testString = @"hello$%^";
NSRange r = [testString rangeOfCharacterFromSet:[NSCharacterSet punctuationCharacterSet]];
if (r.location != NSNotFound) {
    // the string contains a punctuation character
}

句読点文字のすべての位置を知りたい場合は、別の入力範囲で検索を続けてください。何かのようなもの:

NSRange searchRange = NSMakeRange(0, [testString length]);
while (searchRange.location != NSNotFound) {
    NSRange foundRange = [searchString rangeOrCharacterFromSet:[NSCharacterSet punctuationCharacterSet] options:0 range:searchRange];
    searchRange.location = foundRange.location + 1;
    searchRange.length = [testString length] - searchRange.location;
    if (foundRange.location != NSNotFound) {
        // found a character at foundRange.location
    }
}
于 2012-12-14T18:09:52.227 に答える
0

また、NSSet は characterAtIndex セレクターと互換性がありません。

- (BOOL)characterIsMember:(unichar)aCharacter;
- (unichar)characterAtIndex:(NSUInteger)index;

どっちもユニキャラだからこうすればいいのに。

于 2012-12-14T18:09:02.493 に答える
0

率直に言って、文字列の文字をループして、それぞれを個別に検査し、それぞれを if-ladder などで実行して、「シンボル」をチェックします。たとえば、rangeOfCharactersFromSet を使用するどのクルージよりも高速であり、理解しやすく、維持しやすいでしょう。

ヒント:複数回unichar繰り返すのではなく、文字列から文字を 1 回だけ抽出し、temp に入れます。characterAtIndexより速く、より明確に。

また、扱っている文字セットが ASCII (つまり、文字値が 127 以下) の場合、各文字の有効性を示すためにビット配列またはバイト配列を作成できます。(幅の広い文字でもこれを行うことができますが、マップ配列は大きくなります。) NSCharacterSet ほどエレガントではありませんが、すべての条件を 1 つのオブジェクトにまとめることができます。(すべての条件を 1 つの NSCharacterSet にまとめることもできますが、ビットマップを抽出してそれらを OR する必要があります。)

于 2012-12-14T18:21:50.360 に答える