2010-11-24 2 views
0

Запуск нового вопроса, так как мой другой вопрос решил другую проблему с регулярным выражением.Проблема с регулярным выражением с использованием ICU regex/regexkitlite

Вот мое регулярное выражение:

(?i)\\d{1,4}(?<!v(?:ol)?\\.?\\s?)(?![^\\(]*\\))

Regex разделить для ясности:

(?i) - регистронезависимы

\\d{1,4} - число с 1-4 цифр

(?<!v(?:ol)?\\.?\\s?) в номер не может предшествовать 'v', 'v.', 'vol', 'vol.', с o r без пробела на конце.

(?![^\\(]*\\)) - Число не может быть в круглых скобках.

Все это работает, за исключением 'vol.' бит .:

@"Words words 342 words (2342) (words 2 words) (words).ext" результат 342 - правильный.

@"Words - words words (2010) (words 2 words) (words).ext" результат nil - правильный.

@"words words v34 35.ext" результат 34 - неверно.

@"Words vol.342 343 (1234) (3 words) (desc).ext" результат 342 - неверно.

Что я делаю неправильно с моим "vol." раздел?

ответ

2

Вам нужно поставить lookbehind перед номером. Кроме того, вам нужно добавить цифры как незаконные символы внутри lookbehind, или 4 в v.34 будет соответствовать. Попробуйте

(?i)(?<!v(?:ol)?\\.?\\s*\\d*)\\d{1,4}(?![^(]*\\)) 

Это ожидает (редактирование: ошибочно, как выясняется), что regexkitlite поддерживает бесконечное повторение внутри назад ', которые не много регулярных выражений ароматизаторов.

взгляд в docs показывает, что он поддерживает конечное (но переменной) повторение внутри назад ', и если вы знаете, что следующий будет работать только при наличии более одного пространства между vol. и числом, то вы могли бы try

(?i)(?<!v(?:ol)?\\.?\\s?)(?<!\\d)\\d{1,4}(?![^(]*\\)) 
+0

Не работает, боюсь. Кроме того, по последнему вопросу, который я поднял, кто-то сказал, что следы должны появиться после номера. Теперь я не знаю, что думать! – 2010-11-24 18:13:01

Смежные вопросы