Скажем, я хотел бы заменить все a
, которые находятся после двух начальных a
, и у которых есть только a
между ними и первыми двумя a
. Я могу сделать это в Vim, используя (очень волшебное \v
) регулярное выражение s:\v(^a{2}a{-})@<=a:X:g
:
aaaaaaaaaaa
идет к
aaXXXXXXXXX
Однако почему s:\v^a{2}a{-}\zsa:X:g
заменяет только первое вхождение? то есть, давая
aaXaaaaaaaa
Я предполагаю, что это связано с тем, что первое совпадение «поглощает» начало строки и первые 2 a
, так что последующие совпадения совпадают только с тем, что осталось от строки, которая никогда не может снова соответствовать ^
. Это правда? Или, вернее, каково наиболее педагогическое объяснение?
P.S. Это минимальный пример другой проблемы.
Редактировать
Принятый ответ исправил опечатку в исходном регулярном выражении (отсутствует ^
), а его комментарий ответил на вопрос: почему ^
можно «повторно использовать» в ретроспективном выражении, но не в случае \zs
? (Ответ: просмотр назад не использует совпадение, а \zs
использует.)
Дело в том, что (a{2}a{-})@<=a
соответствует любому a
(см. последний a
), которому предшествуют два или более символов a
. В разновидностях регулярных выражений NFA он равен (?<=a{2,}?)a
, см. его демонстрация.
Регулярное выражение ^a{2}a{-}\zsa
соответствует началу строки, затем двум или более a
, затем отбрасывает этот совпадающий текст и соответствует a
. Таким образом, он не может сопоставляться с другими a
, поскольку ^
привязывает совпадение к началу строки (и не допускает сопоставления где-либо еще).
Вы, вероятно, захотите продолжить использовать конструкцию просмотра назад и добавить туда ^
(если вы хотите начать сопоставление только в том случае, если строка начинается с двух a
):
:%s/\v(^a{2}a{-})@<=a/X/g
@Stalpotaten Потому что шаблон просмотра назад не потребляет много энергии. \zs
отмечает только начало значения совпадения после потребление части слева.
Абсолютно, это то, что я имел в виду! Это была моя некрасивая опечатка! Исправлено сейчас. Вопрос больше в том, «почему
^
можно повторно использовать в ретроспективном просмотре, но не в случае\zs
?»