Захваты — это если не высший пилотаж регулярных выражений, но близко к тому. В пределах одного выражения, они позволяют задавать сложные вещи вроде отлова повторяющихся слов (the the или, например, переконцентрации слова "если" в абзаце). Могут также использоваться в выражении замены при замене, что уже является необходимостью в ряде случаев.
Захватить фрагмент текста позволяют сохраняющие скобки \(... \). Они не влияют на совпадение, но то, что в них попало, доступно по номеру открывающей скобки: \1, \2, \3, ..., \9.
Вам нечасто надо много таких выражений (в Перле, кстати, ограничений нет, хоть \999 используй), но пример привести стоит.
Пример первый. Простой. Выражение \(\w\+\)\s\+\1 отловит повторы слов: когда два одинаковых слова стоят подряд через пробел или несколько пробелов.
Пример второй. Выражение ^\(\s*\(\d\+\)\s\+\(\d\+\.\d*\)\) содержит три пары сохраняющих скобок. Первая (по номеру открывающей) пара захватывает все совпадение, если оно нашлось. Оно доступно как \1 в выражении замены, например. А могло бы далее использоваться, это же может быть лишь часть регулярного выражения.
Вторая пара улавливает целое число (\d\+ — одна цифра или больше). от начала строки (^), возможны пробелы (\s*), а потом должно идти число, которое мы поймали и можем получить в \2. Далее должны идти пробелы, а потом вещественное число с точкой (\d\+\.\d*), которое ловит третья пара скобок, и оно доступно как \3.
Вот жизненный пример. Надо имена из формата "И.О. Фамилия" перевести в "Фамилия, И.О.". Поехали:
s/\(\w\.\)\s*\(\w\.\)\s\+\(\w\+\)/\3, \1\2/g
Оператор s///g (выделен жирным) делает замену. Искомое выражение (подчеркнуто):
\(\w\.\)\s*\(\w\.\)\s\+\(\w\+\)
Первая пара скобок (подчеркнута) ловит инициал \w\., вторая пара — второй инициал. Пробелы между инициалами игнорируем. Третья пара ловит фамилию (\w\+). Правда, только английские фамилии, потому что \w с русскими буквами не работает без настройки. Но всегда можно заменить \w на класс символов [а-я]. Выражение замены \3, \1\2 предписывает поставить содержимое третьих скобок на первое место, потом запятую, потом инициалы без пробела.
Тут есть к чему придраться: инициалы бывают из двух букв, вроде Дж. или Ch, например. Но у нас же текстовый редактор! Обработали на автомате, потом вручную просмотрели, можно запустить второй проход.
В выражении замены можно использовать особые последовательности, которые меняют регистр, например: s/\(\w\+\)/\u\1/g — озаглавить каждое слово (в английском тексте). Символ \u озаглавливает первую букву того, что после него стоит. А \U — всё, что после него стоит. Аналогично \l (это L малое, а не i большое) и \L
Обратите внимание: в Перл \1 и т.п. дают доступ к захваченному только в том же выражении! За его пределами, в том числе в выражении замены, они доступны как $1 и т.д.
Все совпадение доступно, кстати, всегда в выражении замены: это символ &. Поэтому не обязательно окружать выражение скобками, если оно вам нужно. Перевести все в верхний регистр можно легко: s/.*/\U&/
А можно в нижний: s/.*/\L&/
Существуют незахватывающие скобки: \%\(...\). Это чуть быстрее, хотя вряд ли сейчас это так актуально. Важнее, что нет ограничения на число скобок. Впрочем, и это редко бывает надо, вот чтоб было много захватов. Разве что таблицу с десятью столбцами надо распарсить и столбцы переставить... Но это лучше сделать другими средствами извне Вим.
Пример: \%\(42\)\+ — это 42, 4242, 424242 и так далее.
Теперь скажу немного о том, как можно обойтись без захватов. Допустим, что Вам надо найти третий столбец в CSV (данные, разделенные запятыми), и заменить там числа меньше 1 на нули, но первые два надо оставить на месте:
s/\([^,]*,[^,]*,\)0\.\d*/\10/
Класс [^,] означает "все символы, кроме запятой". Так что в паре скобок стоят два столбца чего угодно (кроме запятой), разделенные запятой. Далее должно идти число с целой частью нуль, которое мы не ловим (а могли бы и поймать). В замене стоит НЕ десятый захват (это не Перл), а первый (\1) и потом число нуль. Таким образом, мы ставим на место первые два столбца, а меняем только третий.
Можно даже так: s/\(\%\([^,]*,\)*\)0\.\d*/\10/ — мы ищем маленькие числа в любом столбце, пропуская первые сколько надо и сохраняя их как \1.
Но можно намного проще, если применить якорь \zs — начало совпадения (или \ze — конец совпадения). Все, что до \zs, должно быть, но в совпадение не входит:
s/\([^,]*,[^,]*,\)\zs0\.\d*/0/
Первые два столбца должны быть, но в совпадение не войдут, войдет только число, оно и будет заменено.