6

私の目標は、複数の文字の指定されたプレフィックスで始まる(文字列内の)単語の数を数えることです。ケースは「non」で始まる単語です。したがって、この例では...

NSString * theFullTestString = @"nonsense non-issue anonymous controlWord";

...「ナンセンス」と「非発行」でヒットしたいのですが、「匿名」や「controlWord」ではヒットしません。ヒットの総数は2になるはずです。

これが私のテストコードですが、私が試した正規表現形式はどれも正しく機能しません。このコードは、「ナンセンス」(正しい)と「匿名」(間違っている)をキャッチしますが、「問題がない」(間違っている)はキャッチしません。その数は2ですが、間違った理由があります。

NSUInteger countOfNons = 0;
NSString * theFullTestString = @"nonsense non-issue anonymous controlWord";
NSError *error = nil;

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"non(\\w+)" options:0 error:&error];

NSArray *matches = [regex matchesInString:theFullTestString options:0 range:NSMakeRange(0, theFullTestString.length)];

for (NSTextCheckingResult *match in matches) {
    NSRange wordRange = [match rangeAtIndex:1];
    NSString* word = [theFullTestString substringWithRange:wordRange];
    ++countOfNons;
    NSLog(@"Found word:%@  countOfNons:%d", word, countOfNons);
}

私は困惑しています。

4

3 に答える 3

5

正規表現\bnon[\w-]*はトリックを行う必要があります

\bnon[\w-]*
^ (\b) Start of word
  ^ (non) Begins with non
     ^ ([\w-]) A alphanumeric char, or hyphen
          ^ (*) The character after 'non' zero or more times

だから、あなたの場合:

NSUInteger countOfNons = 0;
NSString * theFullTestString = @"nonsense non-issue anonymous controlWord";
NSError *error = nil;

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\bnon[\\w-]*)" options:0 error:&error];

NSArray *matches = [regex matchesInString:theFullTestString options:0 range:NSMakeRange(0, theFullTestString.length)];

for (NSTextCheckingResult *match in matches) {
    NSRange wordRange = [match rangeAtIndex:1];
    NSString* word = [theFullTestString substringWithRange:wordRange];
    ++countOfNons;
    NSLog(@"Found word:%@  countOfNons:%d", word, countOfNons);
}
于 2013-02-06T22:04:33.743 に答える
1

ここでは正規表現は少しやり過ぎだと思います。

NSString *words = @"nonsense non-issue anonymous controlWord";
NSArray *wordsArr = [words componentsSeparatedByString:@" "];
int count = 0;
for (NSString *word in wordsArr) {
    if ([word hasPrefix:@"non"]) {
        count++;
        NSLog(@"%dth match: %@", count, word);
    }
}

NSLog(@"Count: %d", count);
于 2013-02-06T22:02:55.720 に答える
0

これを行うためのより簡単な方法があります。NSPredicateを使用して、この形式BEGINSWITH [c]%@を使用できます。

サンプルコード

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"Firstname BEGINSWITH[c] %@", text];
NSArray *results = [People filteredArrayUsingPredicate:resultPredicate];
于 2014-10-31T18:09:22.247 に答える