Книга: Программирование на языке Ruby

3.6. Позитивное и негативное заглядывание вперед

3.6. Позитивное и негативное заглядывание вперед

Понятно, что регулярное выражение сопоставляется со строкой линейно (осуществляя при необходимости возвраты). Поэтому существует понятие «текущего положения» в строке, это аналог указателя файла или курсора.

Термин «заглядывание» означает попытку сопоставить часть строки, находящуюся дальше текущего положения. Это утверждение нулевой длины, поскольку даже если соответствие будет найдено, никакого продвижения по строке не произойдет (то есть текущее положение не изменится).

В следующем примере строка "New world" будет сопоставлена, если за ней следует одна из строк "Symphony" или "Dictionary". Однако третье слово не будет частью соответствия.

s1 = "New World Dictionary"
s2 = "New World Symphony"
s3 = "New World Order"
reg = /New World(?= Dictionary | Symphony)/
m1 = reg.match(s1)
m.to_a[0]          # "New World"
m2 = reg.match(s2)
m.to_a[0]          # "New World"
m3 = reg.match(s3) # nil

Вот пример негативного заглядывания:

reg2 = /New World(?! Symphony)/
m1 = reg.match(s1)
m.to_a[0]          # "New World"
m2 = reg.match(s2)
m.to_a[0]          # nil
m3 = reg.match(s3) # "New World"

В данном случае строка "New world" подходит, только если за ней не следует строка "Symphony".

Оглавление книги


Генерация: 1.335. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз