2016-05-21 9 views
0

Ich habe ein viele Dateien, in denen einige von ihnen Zeitstempel Präfixe wie dieses:Ich brauche die Länge eines NSRegularExpression Ergebnisstring

1 20160308 1340 - All-of-me_key.pdf 
2 2016 05 15 00 45 - nobody-knows-you-when-you-are-down-and-out.pdf 

Andere dont Präfixe haben:

- praying-for-time_key.pdf 
- purple rain.pdf 
- rehab.pdf 

Das Format der Präfixe variiert. Einige haben Leerzeichen als Trennzeichen und andere haben Striche, wie Sie oben sehen können.

Ich möchte einen Prozess automatisieren, um die Präfixe von betroffenen Dateinamen zu entfernen.

Für die Zwecke dieser Erklärung habe ich zwei regex Muster:

atRegexArray = [NSArray arrayWithObjects: 
       @"[0-9]{8} +[0-9]{4} - ", 
       @"[0-9]{4} +[0-9]{2} +[0-9]{2} +[0-9]{2} +[0-9]{2} - ", nil ] ; 

Die erste Präfixe des ersten Typs erkennt und das zweite Muster detektiert Präfixe des zweiten Typs.

Beispiel für die erste Art Erkennung:

NSString * patternString = @"[0-9]{8} +[0-9]{4} - " ; 
NSString *)theFileName = @"20160308 1340 - All-of-me_key.pdf" ; 

NSString *string = theFileName; 
NSError *error = NULL; 

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:patternString 
            options:NSRegularExpressionCaseInsensitive 
            error:&error]; 

NSUInteger numberOfMatches = [regex numberOfMatchesInString:theFileName 
          options:0 
          range:NSMakeRange(0, [theFileName length])]; 

Erkennung funktioniert. Das Problem ist, ich brauche die Länge des Präfixes. In diesem Beispiel ist die Länge von "20.160.308 1340 -" 16 In example2 der Länge von "2016 05 15 00 45 -" 19

mir nicht sehen, wie diese Länge automatisch was geht.

Irgendeine Idee?

+0

brauchst du ** [this] (https://regex101.com/r/jD7qR2/1) **? – rock321987

Antwort

1

Wenn Sie wirklich nur die Zeichenfolge nach dem Präfix möchten, können Sie dafür Klammern verwenden. Wenn Sie eine Übereinstimmung mit einer Anzahl von bestimmten Zahlenmustern erzielen möchten, fügen Sie einfach die verschiedenen Muster ein, die durch | getrennt sind. Zum Beispiel:

NSArray *strings = @[@"20160308 1340 - All-of-me_key.pdf", 
        @"2016 05 15 00 45 - nobody-knows-you-when-you-are-down-and-out.pdf", 
        @"- praying-for-time_key.pdf"]; 

NSString *patternString = @"^(\\d{8} \\d{4} |\\d{4} \\d{2} \\d{2} \\d{2} \\d{2})?(.*)$"; 

NSError *error; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:patternString 
                     options:0 
                     error:&error]; 

for (NSString *string in strings) { 
    NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, string.length)]; 
    if (match) { 
     NSLog(@"length of prefix = %ld", (long)[match rangeAtIndex:1].length); 
     NSLog(@"stringAfterPrefix = '%@'", [string substringWithRange:[match rangeAtIndex:2]]); 
    } 
} 

Das ergibt:

 
length of prefix = 14 
stringAfterPrefix = '- All-of-me_key.pdf' 

length of prefix = 17 
stringAfterPrefix = '- nobody-knows-you-when-you-are-down-and-out.pdf' 

length of prefix = 0 
stringAfterPrefix = '- praying-for-time_key.pdf' 

Es gibt viele Permutationen auf dieser Idee (unter Berücksichtigung der variablen Anzahl von Leerzeichen nach dem Präfix, die führenden dash off zu Strippen usw.), aber hoffentlich veranschaulicht dies die Grundidee, die einfangenden Klammern zu verwenden, um den fraglichen Text zu finden, und die Verwendung von |, um auf möglicherweise mehrere verschiedene Präfixe zu passen.

+0

Funktioniert wie ein Charme;)) –

+0

[Nein, danke] (http://stackoverflow.com/help/someone-answers). – Rob