Лучший способ найти короткие теги в vim - это найти все вхождения <?
, за которыми не следует p
:
/<?[^p]
Причина, по которой ваше регулярное выражение терпит неудачу в vim, заключается в том, что /?
находит буквальные вопросительные знаки, тогда как \?
является квантификатором; /<\?
в vim попытается найти 0 или 1 знак меньше. Это в обратном направлении от того, что вы могли ожидать в большинстве механизмов регулярных выражений.
Если вы хотите сопоставить короткие теги, за которыми сразу следует новая строка, вы не можете использовать [^p]
, для чего требуется, чтобы там было что-то для соответствия, которое не является p
. В этом случае вы можете сопоставить «не p или конец строки» с
/<?\($\|[^p]\)