2013-02-06 13 views
5

Mein Ziel ist es, die Anzahl der Wörter (in einer Zeichenfolge) zu zählen, die mit einem angegebenen Präfix aus mehr als einem Buchstaben beginnen. Ein Fall sind Wörter, die mit "nicht" beginnen. So in diesem Beispiel ...Verwenden von regulären Ausdrücken, um Wörter zu finden, die mit einem dreistelligen Präfix beginnen

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

... Ich will auf „Unsinn“ Treffer erhalten und „Nicht-Thema“, jedoch nicht für „anonym“ oder „Control“. Die Gesamtzahl meiner Treffer sollte 2 sein.

Also hier ist mein Test-Code, der nah scheint, aber keiner der regulären Ausdruck Formen, die ich ausprobiert habe, funktioniert richtig. Dieser Code fängt "Unsinn" (korrekt) und "anonym" (falsch) ab, aber nicht "nicht" (falsch). Seine Zählung ist 2, aber aus dem falschen Grund.

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); 
} 

Ich bin ratlos.

Antwort

5

Die Regex \bnon[\w-]* sollte

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

Also den Trick tun, in Ihrem Fall:

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); 
} 
+1

+1 OP hat nicht gesagt, aber bedenken Sie 'NSRegularExpressionCaseInsensitive' wenn gemischt Fall wäre ein Spiel betrachtet werden. Möglicherweise auch 'NSRegularExpressionUseUnicodeWordBoundaries'. – Rob

1

Ich denke, dass reguläre Ausdrücke ein bisschen ein Overkill hier sind.

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); 
0

Es einfacher Weg, dies zu tun ist. Sie können NSPredate verwenden und dieses Format BEGINSWITH [c]% @ verwenden.

Beispielcode

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"Firstname BEGINSWITH[c] %@", text]; 
NSArray *results = [People filteredArrayUsingPredicate:resultPredicate]; 
Verwandte Themen