Почему регулярное выражение работает в Sublime, а не в vim?

Попытка поиска регулярного выражения найдена в этом ответе:

(,)(?=(?:[^']|'[^']*')*$)

Я попытался выполнить поиск в Sublime, и это сработало (около 700 результатов). При попытке заменить результаты не хватает памяти. Пытался /(,)(?=(?:[^']|'[^']*')*$) в vim для поиска сначала, но он не находит экземпляры шаблона. Также пытался избежать всех ( а также ) с \ в регулярном выражении

4 ответа

Решение

Vim использует свой собственный механизм регулярных выражений и синтаксис (кстати, предшествующий PCRE), поэтому для переноса регулярных выражений из perl или другого редактора, скорее всего, потребуется некоторая работа.

Много различий слишком много, чтобы перечислять здесь подробно, но :help pattern а также :help perl-patterns поможет.

В любом случае, это быстрое и грязное переписывание вашего регулярного выражения, кажется, работает на примере, приведенном в связанном вопросе:

/\v(,)(\@=([^']|'[^']*')*$)

Увидеть :help \@= а также :help \v,

Одним из возможных объяснений является то, что механизм регулярных выражений, используемый в Sublime, отличается от механизма, используемого в vim.

Не все движки регулярных выражений созданы равными; не все они поддерживают одинаковые функции. (Например, функция "негативного просмотра" может быть очень мощной, но не все механизмы поддерживают ее. И синтаксис для некоторых функций отличается между механизмами.)

Краткое сравнение механизмов регулярных выражений доступно здесь:

http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines

К сожалению, Vim использует другой движок, и "нормальные" регулярные выражения не будут работать. Упомянутое вами регулярное выражение не является идеальным: оно не пропускает пропущенные кавычки, но, насколько я понимаю, для вас этого достаточно. Попробуйте это, и если что-то не соответствует, пожалуйста, пришлите мне этот кусок.

\v^([^']|'[^']*')*\zs,

Небольшое объяснение:

\v позволяет очень волшебный поиск, чтобы избежать сложных правил выхода

([^']|'[^']*') соответствует всем символам, кроме кавычки и пары цитат

\zs указывает на начало выбора; Вы можете думать об этом как о замене взгляду назад.

Вы должны избежать |иначе это не работает под vim. Вам также следует избегать круглых скобок, если вы не ищете символы "(" или ")".

Более подробную информацию об использовании регулярных выражений в vim можно найти на http://vimregex.com/.

Другие вопросы по тегам