Я пытаюсь изучить регулярные выражения из нескольких источников, но столкнулся с путаницей в отношении обратного отслеживания, потому что каждый определяет возврат, что означает состояние, когда механизм регулярных выражений не соответствует шаблону, поэтому он возвращается в положение где первый атом соответствовал , например, чтобы соответствовать cat
в He captured a catfish for his cat
, двигатель будет работать следующим образом:
- Он будет искать
c
, пока не найдет соответствиеc
в captured
- , то же самое для
a
- , но не удается сопоставить
t
с p
- , когда двигатель возвращается в положение после
c
в captured
, поскольку он знал, что до этого момента совпадение не произойдет.
Таким образом, во всех случаях без квантификаторов двигатель будет сбрасывать весь шаблон, чтобы попытаться снова сопоставить его.из другой позиции.
Другой определяет откат назад как состояние использования квантификатора, подобного .*
, поэтому механизм регулярных выражений будет соответствовать полному тексту, что приводит к сбою, поэтому он возвращает один за другим до совпаденияч происходит.я думаю, что это не одно и то же.
Как указано здесь :
Фундаментальная особенность сопоставления регулярных выражений включает в себя понятие, называемое обратным отслеживанием.который используется (когда это необходимо) всеми квантификаторами регулярных выражений, а именно *, * ?, +, + ?, {n, m} и {n, m}?.
Для сопоставления регулярного выражения, все регулярное выражение должно совпадать, а не только его часть.Таким образом, если начало шаблона, содержащего квантификатор, завершается успешно, что приводит к сбою более поздних частей шаблона, соответствующий механизм выполняет резервное копирование и пересчитывает начальную часть, поэтому он называется обратным отслеживанием.
Это означает, что шаблон, подобный ([A-Z][A-Z0-9]*)\b[^>]*>.*<\/\1>
для соответствия Testing <B><I>bold italic</I></B> text.
, будет работать следующим образом:
- Сначала он будет соответствовать
<B>
- Затем шаблон должен соответствовать
.*
который будет соответствовать до конца строки. - , затем он будет пытаться соответствовать
<
, но он уже достиг конца, поэтому он будет возвращать один символ за другим, пока не совпадет.
В отличие от первого cat
примера, который полностью сбрасывает двигатель до самого первого атома и запускает снова с позиции, соответствующей первому атому.
Но в другой ситуации, если я добавлю ?
после .*
, регулярное выражение пропускает этот атом .*?
, пытаясь сопоставить оставшиеся символы, но если нет совпадения, оно возвращается к .
, чтобы соответствовать, пока не будет <
, а затем начинайте сопоставлять атомы после него.
Я думаю, что здесь есть несколько определений, кто-нибудь объяснит, какой из этих случаев является возвращением.