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

Я пытаюсь отсканировать заданную строку на номер. Номер не может быть после "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 ответа

Решение

Ваш negative lookbehind расположен неправильно. 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}.*\\))

В конце концов закончили с этим регулярным выражением:

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

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

Другие вопросы по тегам