Выражение регулярного выражения с использованием регулярного выражения ICU для поиска чисел, не входящих в скобки - PullRequest
2 голосов
/ 22 ноября 2010

Я пытаюсь отсканировать заданную строку на номер.Номер не может быть после "v / v. / Vol / vol.", И не может быть в скобках.Вот что у меня есть:

NSString *regex = @"(?i)(?<!v|vol|vol\\.|v\\.)\\d{1,4}(?![\\(]{0}.*\\))";
NSLog(@"Result: %@", [@"test test test 4334 test test" stringByMatching:regex]);
NSLog(@"Result: %@", [@"test test test(4334) test test" stringByMatching:regex]);
NSLog(@"Result: %@", [@"test test test(vol.4334) test test" stringByMatching:regex]);

Ужасно, это не работает.Мое регулярное выражение можно разделить на четыре части:

(?i) - сделать регистр нечувствительным к регистру

(?<!v|vol|vol\\.|v\\.) - отрицательное утверждение для v / v. / Vol / vol.

\\d{1,4} - номер, который я ищу, 1-4 цифры.

(?![\\(]{0}.*\\)) - отрицательное прогнозное утверждение: число не может предшествовать a), если только нет (до него.

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

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Ваш negative lookbehind расположен неправильно.Смотрящие сзади не изменяют позицию ввода, ваш negative lookbehind должен следовать после вашего \d{1,4} выражения:

(?i)\\d{1,4}(?<!v|vol|vol\\.|v\\.)(?![\\(]{0}.*\\))

В качестве альтернативы, просто используйте negative lookahead для достижения той же цели:

(?i)(?!v|vol|vol\\.|v\\.)\\d{1,4}(?![\\(]{0}.*\\))
1 голос
/ 23 ноября 2010

Наконец получилось регулярное выражение:

(?i)\\d{1,4}(?<!v|vol|vol\\.|v\\.)(?![^\\(]*\\))

Отрицательный взгляд, который необходимо изменитьПроходит все мои тесты.Спасибо Алексу за неправильное определение местоположения моего NLB.

...