Почему регулярное выражение работает в 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/.