Мне нужно проверить следующий формат строки:

text-text-id-text

Разделителем является символ «-». Третий столбец всегда должен иметь идентификатор. Я написал следующее регулярное выражение (на Python), которое проверяет строку:

import re

s = 'col1-col2-col3-id' # any additional text at the end
                        # is allowed e.g. -col4-col5
print re.match('^(.*-){3}id(-.*)?$', s) # ok 
print re.match('^(.*-){1}id(-.*)?$', s) # still ok, is should not be

Я пробовал добавить нежадный режим, но результат тот же:

^(.*?-){1}id(-.*)?$

Что мне не хватает в моем регулярном выражении? Я мог бы просто проверить строку вот так:

>>> import re
>>> print re.split('-', 'col1-col2-col3-id')
['col1', 'col2', 'col3', 'id']

А затем проверьте, соответствует ли третий элемент идентификатору, но меня интересует, почему первое регулярное выражение работает, как указано выше.

11
broadband 15 Авг 2014 в 15:10

1 ответ

Лучший ответ

Ваше первое регулярное выражение неверно, поскольку оно утверждает, что id присутствует после первых трех элементов.
Ваше второе регулярное выражение неправильно соответствует строке, потому что .* также соответствует дефисам.

Вы должны использовать это регулярное выражение:

/^(?:[^-]+-){2}id/

Вот демонстрация регулярного выражения!

А если вам нужно привязать регулярное выражение к концу, используйте /^(?:[^-]*-){2}id.*$/!


Как упоминал Тим Пицкер, рассмотрите возможность утверждения id в конце элемента:

/^(?:[^-]+-){2}id(?![^-])/

Вот ОБНОВЛЕННАЯ демонстрация регулярных выражений!

10
Community 23 Май 2017 в 15:29