Просмотр вперёд

Рейтинг: 0Ответов: 1Опубликовано: 19.09.2014

Есть такое регулярное выражение:

abc(?=d)e

Есть такая строка: abcde.
Почему регулярка не срабатывает? abc нашли, далее просматриваем вперёд, d есть, и в конце e.

Ответы

▲ 3Принят

Смотрите, что происходит для регулярки abc(?=d)e по строке "abcde".

  1. Вход: "abcde". Результат: <пустой>.
  2. Из исходной строки в результат выбираются первые три буквы - они точно есть. Вход: "de". Результат: "abc".
  3. Далее идет просмотр вперед буквы 'd' - (?=d). Просмотр вперед не двигает курсор по входной строке. Вход: "de". Результат: "abc".
  4. Далее пытаемся выбрать букву 'e' из входной строки, но у нас на очереди еще только 'd'. Матчинг останавливается, расходимся.

То, что вы, возможно, ожидаете получить, можно получить регулярным выражением abc(?=d).e. Точка выберет из входной строки букву 'd', затем отработает буква 'e' и поиск успешно закончится, вернув "abcde".

Правда, того же результата можно было добиться и просто выражением abcde. Непонятно, зачем вам здесь просмотр вперед. Он обычно нужен, когда за искомым выражением что-то должно быть, но попасть в результат не должно.