6 Stimmen

Wie man reguläre Ausdrücke verwendet, um Wörter zu finden, die mit einem dreistelligen Präfix beginnen

Mein Ziel ist es, die Anzahl der Wörter (in einem String) zu zählen, die mit einem spezifizierten Präfix von mehr als einem Buchstaben beginnen. Ein Fall sind Wörter, die mit "non" beginnen. Also in diesem Beispiel...

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

... möchte ich Treffer bei "nonsense" und "non-issue" erhalten, aber nicht bei "anonymous" oder "controlWord". Die Gesamtanzahl meiner Treffer sollte 2 sein.

Hier ist also mein Testcode, der fast funktioniert, aber keiner der regulären Ausdrucksformen, die ich ausprobiert habe, funktioniert korrekt. Dieser Code erfasst "nonsense" (richtig) und "anonymous" (falsch), aber nicht "non-issue" (falsch). Seine Anzahl 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(@"Gefundenes Wort:%@  Anzahl von Nons:%d", word, countOfNons);
}

Ich bin ratlos.

5voto

WDUK Punkte 18830

Der reguläre Ausdruck \bnon[\w-]* sollte den Trick tun

\bnon[\w-]*
^ (\b) Wortanfang
  ^ (non) Beginnt mit non
     ^ ([\w-]) Ein alphanumerisches Zeichen oder ein Bindestrich
          ^ (*) Das Zeichen nach 'non' null oder mehrmals

Also, 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(@"Gefundenes Wort:%@  countOfNons:%d", word, countOfNons);
}

1voto

Ich denke, reguläre Ausdrücke sind hier ein wenig übertrieben.

NSString *words = @"Nonsens Nicht-Thema anonyme Kontrollwort";
NSArray *wordsArr = [words componentsSeparatedByString:@" "];
int count = 0;
for (NSString *word in wordsArr) {
    if ([word hasPrefix:@"non"]) {
        count++;
        NSLog(@"%d. Übereinstimmung: %@", count, word);
    }
}

NSLog(@"Anzahl: %d", count);

0voto

Ajumal Punkte 1018

Es gibt einen einfacheren Weg, um dies zu tun. Sie können NSPredicate verwenden und dieses Format BEGINWITH[c] %@ verwenden.

Beispielcode

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"Vorname BEGINWITH[c] %@", text];
NSArray *results = [People filteredArrayUsingPredicate:resultPredicate];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X