Регулярное выражение с использованием ICU regex / regexkitlite - PullRequest
0 голосов
/ 24 ноября 2010

Начало нового вопроса, поскольку мой другой вопрос решил другую проблему с регулярным выражением.

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

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

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

(?i) - без учета регистра

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

(?<!v(?:ol)?\\.?\\s?) этому номеру не может предшествовать 'v', 'v. ',' vol ',' 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.'раздел

1 Ответ

2 голосов
/ 24 ноября 2010

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

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

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

Просмотр документов показывает, что он поддерживает конечное (но переменное) повторение внутри вид сзади, и если вы знаете, что следующее будет работать, только если между * 1010 есть не более одного пробела и номер, тогда вы можете попробовать

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