2012-12-19 8 views
6

Ich versuche, zwischen zwei Dateien (im NSString-Format) zu unterscheiden. Soweit ich weiß, kann dies durch Vergleichen und Vergleichen eines regulären Ausdrucks geschehen. Das Format der 2 jpg-Dateien, die ich habe, sind:Übereinstimmen eines regulären Ausdrucks mit einer Zeichenfolge (Dateiname)

butter.jpg

Butter-1.jpg

Meine Frage ist, was regulären Ausdruck kann ich schreiben, um die 2 Strings übereinstimmen über? Ich habe gesucht und einen Beispielausdruck gefunden, aber ich bin mir nicht sicher, wie es gelesen wird und denke, dass es falsch ist.

Hier ist mein Code:

NSString *exampleFileName = [NSString stringWithFormat:@"butter-1.jpg"]; 

NSString *regEx = @".*l{2,}.*";  

NSPredicate *regExTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx]; 

if ([regExTest evaluateWithObject:exampleFileName] == YES) { 
    NSLog(@"Match!"); 
} else { 
    NSLog(@"No match!"); 
} 

EDIT:

ich das versucht, mit folgenden:

NSString *regEx = @"[a-z]+-[0-9]+.+jpg"; 

zu versuchen, entsprechen:

NSString *exampleFileName = [NSString stringWithFormat:@"abcdefg-112323.jpg"]; 

Getestet mit:

abc-11.jpg (Match)

abcsdas-.jpg (keine Übereinstimmung)

abcdefg11. (Keine Übereinstimmung)

abcdefg-3123.jpg (Match)

Ab jetzt funktioniert es, aber ich will alle Chancen beseitigen, daß es nicht, alle Eingaben?

+0

Sie müssen Ihre Abgleichkriterien genauer erläutern. Warum sagst du nicht einfach '[exampleFileName hasPrefix: @" butter "] && [exampleFileName hasSuffix: @". Jpg "]'? –

+0

Hallo, tut mir leid. Meine Kriterien sind, dass .jpg dort sein muss, wo Butter alles sein kann, solange es ein Alphabet ist. Der Bindestrich und die Ziffer müssen jedoch vorhanden sein. – Dawson

Antwort

4
NSString *regEx = @"[a-z]+-[0-9]+.+jpg"; 

für butter.jpg scheitern, da es ein - und zumindest auf Nummer haben muss.

NSString *regEx = @"[a-z]+(-[0-9]+){0,1}.jpg"; 

und wenn Sie

NSString *regEx = @"([a-z])+(?:-([0-9])+){0,1}.jpg"; 

tun können Sie die Informationen wahrscheinlich würden Sie zugreifen möchten später als Capture-Gruppen haben.

(...) | Erfassen von Klammern. Ein Eingabebereich, der dem eingeklammerten Teilausdruck entspricht, ist nach der Übereinstimmung verfügbar.

und wenn Sie nicht brauchen, Einfanggruppen

NSString *regEx = @"(?:[a-z])+(?:-[0-9]+){0,1}.jpg"; 

(? ...) | Nicht erfassende Klammern. Gruppiert das eingeschlossene Muster, bietet jedoch keine Erfassung von übereinstimmendem Text. Etwas effizienter als das Erfassen von Klammern.

+0

Zu viele unnötige einfangende Gruppen ... – nhahtdh

+0

danke für die Antwort, ich habe butter.jpg vergessen. Macht es Ihnen etwas aus, mir zu erklären, was {0,1} bedeutet? – Dawson

+0

@nhahtdh - wissen Sie, auf welche Informationen OP zugreifen möchten? – vikingosegundo

2

Sie können ein alphabetisches Zeichen (in jeder Sprache) mit \p{L} abgleichen.Sie können eine Ziffer mit \d abgleichen. Sie müssen die . umgehen, da . in einem regulären Ausdruck "beliebiges Zeichen" bedeutet.

Parsen eines regulären Ausdrucks ist teuer, Sie sollten es also nur einmal tun.

BOOL stringMatchesMyPattern(NSString *string) { 
    static dispatch_once_t once; 
    static NSRegularExpression *re; 
    dispatch_once(&once, ^{ 
     re = [NSRegularExpression regularExpressionWithPattern: 
      @"^\\p{L}+-\\d+\\.jpg$" options:0 error:NULL]; 
    } 

    return nil != [re firstMatchInString:string options:0 
     range:NSMakeRange(0, string.length)]; 
} 
Verwandte Themen