2012-12-19 14 views
6

Próbuję rozróżnić 2 pliki (w formacie NSString). O ile mi wiadomo, można to zrobić, porównując i dopasowując wyrażenie regularne. Format tych 2 plików jpg, które mam są:Dopasowywanie wyrażenia regularnego z ciągiem znaków (nazwa pliku)

butter.jpg

masło-1.jpg

Moje pytanie brzmi, co wyrażenie regularne można napisać, aby dopasować 2 ciągi powyżej? Szukałem i znalazłem przykładowe wyrażenie, ale nie jestem pewien, jak jest czytane i uważam, że jest błędne.

Oto mój kod:

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:

Próbowałem przy użyciu następujących:

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

spróbować dopasować:

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

Testowane z:

ABC-11.jpg (mecz)

abcsdas-.jpg (No match)

abcdefg11. (No Match)

abcdefg-3123.jpg (mecz)

Jak na razie to działa, ale chcę, aby wyeliminować wszelkie szanse, że może nie, każdy wejść?

+0

Musisz wyjaśnić bardziej szczegółowo swoje kryteria dopasowania. Dlaczego nie powiedzieć "[exampleFileName hasPrefix: @" butter "] && [exampleFileName hasSuffix: @". Jpg "]'? –

+0

Cześć, przepraszam za to. Moje kryteria to to, że .jpg musi być tam, gdzie masło może być czymkolwiek, o ile jest alfabetem. Jednak myślnik i cyfra muszą tam być. – Dawson

Odpowiedz

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

zawiedzie dla butter.jpg, ponieważ musi mieć jedną - i przynajmniej na numer.

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

a jeśli nie

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

można uzyskać dostęp do informacji pewnie chciałby mieć później jako grupy przechwytywania.

(...) | Przechwytywanie nawiasów. Zakres danych wejściowych pasujących do podwyrażonego nawiasów jest dostępny po dopasowaniu.

i jeśli nie potrzebujemy grupy przechwytywania

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

(? ...) | Nieprzechwytujące nawiasy. Grupuje dołączony wzorzec, ale nie zapewnia przechwytywania pasującego tekstu. Nieco bardziej wydajne niż przechwytywanie nawiasów.

+0

Zbyt wiele niepotrzebnych grup przechwytujących ... – nhahtdh

+0

dzięki za odpowiedź, zapomniałem o butter.jpg. Czy możesz mi wyjaśnić, co oznacza {0,1}? – Dawson

+0

@nhahtdh - czy wiesz, jakie informacje OP chce uzyskać dostęp? – vikingosegundo

2

Można dopasować znak alfabetyczny (w dowolnym języku), używając \p{L}.Możesz dopasować cyfrę za pomocą \d. Musisz uciec ., ponieważ w wyrażeniu regularnym . oznacza "dowolny znak".

Parsowanie wyrażenia regularnego jest kosztowne, więc należy to zrobić tylko raz.

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)]; 
} 
Powiązane problemy