2014-11-16 1 views
0

Я нахожусь в iOS, но практически любой язык будет переведен.Regex, чтобы определить, является ли путь корневым каталогом

Я пытаюсь написать регулярное выражение соответствует корневому каталогу:

т.е.

Первый/должен соответствовать
Первого/file.txt не должен соответствовать
первого/следующий должен не соответствовать
Первый или следующий/файл.txt не должен соответствовать

Итак, я думаю, что логика должна начинаться с начала строки, совпадающей с любым символом, кроме «/», тогда совпадение «/» выполняется только один раз и один раз быть в конце строки.

у меня есть:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\/]*\\/$" options:NSRegularExpressionCaseInsensitive error:&error]; 

    NSUInteger matches = [regex numberOfMatchesInString:info.name options:NSRegularExpressionCaseInsensitive range:NSMakeRange(0, [info.name length])]; 
    if (matches > 0) { 
     NSLog(@"match"); 
    } else { 
     NSLog(@"not a match"); 
    } 

Но его не соответствие, как это должно быть.

Думая

[^\\/]* 

будут соответствовать все символы, которые не являются "/"

Тогда

\\/$ 

будет соответствовать "/", который находится в конце строки.

Куда я иду не так?

+0

пример наряду с ожидаемым выходом будет лучше. –

+0

Вы имеете в виду это '@"^[^ \\ /] */[^ \\ /] * $ "' –

+0

Спасибо. Просто уточнить для моего собственного понимания.^[^ \\ /] * означает начало в начале и соответствие всем символам, кроме «/». Затем/соответствует одному «/», затем [^ \\ /] * $, который я не совсем уверен, зачем вам это нужно, но сопоставляйте любые символы, а не «/», а затем заканчивайте. Будет ли это делать то же самое @ "^ [^ \\ /] */$ – lostintranslation

ответ

1

регулярное выражение будет:

^[^/]*/$ 

Это гарантирует, что строка заканчивается с косой черты, и он может содержать 0 или более без косой черты перед ним.

Другим решением (без регулярного выражения) будет следующим образом:

NSString *name = ... // some path 
if (name.length && [name rangeOfString:@"/"].location == name.length - 1) { 
    // root directory 
} 
+0

Является ли ваше второе (не регулярное решение) быстрее или «лучше» по какой-либо причине. для справки! – lostintranslation

+1

Регулярные выражения, как правило, медленны и неэффективны и имеют тенденцию к злоупотреблению. Мое второе решение намного быстрее, потому что оно специфично для одной задачи. – rmaddy