2012-04-03 6 views
3

Ich arbeite an einem String-Pattern-Match-Algorithmus. Ich verwende NSRegularExpression, um die Übereinstimmungen zu finden. Für die Ex: Ich habe alle Wörter mit ‚#‘ zu finden in einer Reihe .. Derzeit verwende ich die folgende regex Funktion:Suchmuster in String mit Regex in Obj-c

static NSRegularExpression *_searchTagRegularExpression; 
static inline NSRegularExpression * SearchTagRegularExpression() 
{ 
    if (!_searchTagRegularExpression) 
    { 
      _searchTagRegularExpression = [[NSRegularExpression alloc] 
              initWithPattern:@"(?<!\\w)#([\\w\\._-]+)?" 
                options:NSRegularExpressionCaseInsensitive 
                error:nil]; 
    } 

    return _searchTagRegularExpression; 
} 

und ich es verwenden, wie unten:

NSString *searchString = @"Hi, #Hash1 #Hash2 #Hash3..."; 
NSRange searchStringRange = NSMakeRange(0, searchString.length); 
NSRegularExpression *regexp = SearchTagRegularExpression(); 
[regexp enumerateMatchesInString:searchString 
         options:0 
          range:searchStringRange 
         usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
{  
    // comes here for every match with range (in this case thrice) 
}]; 

Dies funktioniert ordnungsgemäß. Aber ich möchte nur wissen, ob dies der beste Weg ist. schlagen Sie vor, wenn es irgendeine bessere Alternative gibt ...

Antwort

1

Eigentlich Ihre vorgeschlagene Muster und Umsetzung ist recht gut:

  • Das Muster ist ziemlich genau mit der Verwendung der (Phantasie) Null-Breite negativ Blick hinter Behauptung um sicherzustellen, dass Sie nur am Anfang eines Wortes übereinstimmen. Es funktioniert zum Beispiel am Anfang eines Strings korrekt.

  • Die Implementierung verwendet das Regex-Objekt erneut und verhindert die Neukompilierung des Musters.

Wenn Sie wollten, dass ich pingelig sein: Sie könnten die NSRegularExpressionCaseInsensitive Option fallen als Muster, das einen Fall haben keine Teile verwenden.

+0

Tnks für die Eingabe .. ich sollte versuchen, caseinsensitive Suche zu entfernen und die Zeit protokollieren, um den Unterschied zu sehen !!! – manileo86

-1

Was Sie tun, ist ein guter Weg sicher. Sie können dies auch tun,

for(NSString *match in [string componentSeperatedByString:@" "]) 
    { 
     if([match hasPrefix:@"#"]) 
     { 
     //do what you like. 
     } 
    } 
+0

Nein. Das würde jedes Zeichen als ein Wortzeichen (einschließlich Interpunktion und so) übereinstimmen. Es würde auch einzelne # Zeichen entsprechen. –

+0

Dies wird scheinbar zu einer schlechten Leistung führen. – manileo86