Почему я должен выйти из финала] - PullRequest
2 голосов
/ 19 мая 2011

У меня есть файл, содержащий такую ​​строку:

print  $hash_xml->{'div'}{'div'}{'div'}[1]...

Я хочу заменить {'div'}{'div'}{'div'}[1] чем-то другим.

Итак, я попытался

%s/{'div'}{'div'}{'div'}[1]/by something else/gc

Строки не найдены. Я, хотя я должен был бежать {, }, [ и ]

Строка еще не найдена.

Поэтому я попытался найти один {, и он нашел их. Затем я попытался найти {'div'}{'div'}{'div'}, и он снова нашел его.
Тогда {'div'}{'div'}{'div'}[1 все еще был найден.

найти {'div'}{'div'}{'div'}[1]

Мне пришлось использовать %s/{'div'}{'div'}{'div'}[1\]

Почему?

vim 7.3 в Linux

Ответы [ 4 ]

7 голосов
/ 19 мая 2011

[] используются в регулярных выражениях для переноса диапазона допустимых символов.

Когда оба поставляются без экранирования, vim обрабатывает строку поиска как регулярное выражение.

Поэтому, когда вы пропускаете его или экранируете последний символ, vim не может интерпретировать одну скобку в контексте регулярного выражения, так же как и буквальный поиск (в основном, лучшее, что он может сделать, учитывая строку поиска).

Лично я бы избежал открывающей и закрывающей квадратной скобки, чтобы убедиться, что смысл ясен.

5 голосов
/ 19 мая 2011

Это потому, что символы [ и ] используются для построения шаблона поиска.

См. :h pattern и используйте файл справки pattern.txt, чтобы попробовать следующий эксперимент:

  • Поиск шаблона «[9-0]» (без кавычек) с использованием /[0-9] будет сопоставлять каждую цифру от 0 до 9 в отдельности (см. :h \[)

  • Теперь, если вы попробуете /\[0-9] или /[0-9\], вы сопоставите весь шаблон: ноль, дефис и девять внутри квадратных скобок. Это потому, что когда вы выходите из одного из [ или ], оператор [*] перестает существовать.

Используя ваш шаблон поиска, /{'div'}{'div'}{'div'}[1\] и /{'div'}{'div'}{'div'}\[1] должны совпадать с тем же шаблоном, который вам нужен, а /{'div'}{'div'}{'div'}[1] соответствует строке {'div'}{'div'}{'div'}1.

2 голосов
/ 19 мая 2011

Чтобы избежать попадания этих специальных символов в регулярные выражения, попробуйте использовать флаг very magic.

например:.

:%s/\V{'div'}[1]/replacement/

Обратите внимание на флаг \V в начале строки.

1 голос
/ 19 мая 2011

Потому что квадратные скобки означают, что vim думает, что вы ищете каких-либо персонажей внутри.Это известно как «класс персонажа».Избегая любой из квадратных скобок, это дает vim знать, что вы ищете буквальную квадратную строку, заканчивающуюся '[1]'.

В идеале вы должны написать выражение как:

%s/{'div'}{'div'}{'div'}\[1\]/replacement string/

, чтобы значение было полностью ясным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...