Выражение регулярного выражения с использованием регулярного выражения 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.