2012-12-19 14 views
6

Sto tentando di distinguere tra 2 file (in formato NSString). Per quanto ne so, questo può essere fatto confrontando e abbinando un'espressione regolare. Il formato dei file jpg 2, che ho sono:Corrispondenza con un'espressione regolare con una stringa (nome file)

butter.jpg

burro-1.jpg

La mia domanda è che cosa espressione regolare posso scrivere per abbinare le 2 corde sopra? Ho cercato e trovato un'espressione di esempio, ma non sono sicuro di come viene letto e penso che sia sbagliato.

Ecco il mio codice:

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:

Ho provato ad utilizzare il seguente:

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

per cercare di abbinare:

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

Testato con:

abc-11.jpg (Match)

abcsdas-.jpg (No Match)

abcdefg11. (No Match)

abcdefg-3123.jpg (Match)

A partire da ora funziona, ma voglio eliminare ogni possibilità che non potrebbe, eventuali ingressi?

+0

È necessario spiegare i criteri di corrispondenza in modo più dettagliato. Perché non dire semplicemente '[exampleFileName hasPrefix: @" butter "] && [exampleFileName hasSuffix: @". Jpg "]'? –

+0

Ciao, mi dispiace per quello. Il mio criterio è che .jpg deve essere lì, dove il burro può essere qualsiasi cosa purché sia ​​un alfabeto. Tuttavia il trattino e la cifra devono essere lì. – Dawson

risposta

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

falliranno per butter.jpg, come ha bisogno di avere una - e almeno il numero.

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

e se lo fai

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

è possibile accedere alle informazioni che probabilmente piacerebbe avere più tardi come gruppi di cattura.

(...) | Acquisizione di parentesi. L'intervallo di input che corrisponde alla sottoespressione tra parentesi è disponibile dopo la corrispondenza.

e se non avete bisogno di gruppi di acquisizione

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

(:? ...) | Parentesi non cattura. Raggruppa il modello incluso, ma non fornisce la cattura del testo corrispondente. Un po 'più efficiente rispetto all'acquisizione di parentesi.

+0

Troppi gruppi di acquisizione non necessari ... – nhahtdh

+0

grazie per la risposta, ho dimenticato di butter.jpg. Ti spiego spiegandomi cosa significa {0,1}? – Dawson

+0

@nhahtdh - sai, quali informazioni OP vuoi accedere? – vikingosegundo

2

È possibile abbinare un carattere alfabetico (in qualsiasi lingua) utilizzando \p{L}.È possibile abbinare una cifra usando \d. Devi sfuggire allo . perché in un'espressione regolare, . significa "qualsiasi carattere".

L'analisi di un'espressione regolare è costosa, quindi è necessario eseguirla solo una volta.

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)]; 
} 
Problemi correlati