Поиск замещения регулярного выражения в Sublime Text 2

Я ищу сделать замену поиска регулярными выражениями в Sublime Text 2. Документация на этом довольно анемична. В частности, я хочу сделать замену на группах, поэтому что-то вроде преобразования этого текста:

Hello my name is bob

И этот термин поиска:

Найти что: my name is (\w)+

Заменить на: my name used to be $(1)

Поисковый запрос работает просто отлично, но я не могу найти способ сделать замену, используя группу regexp.

Ответ 1

Обычно обратная ссылка равна $1 или \1 (обратная косая черта) для первой группы захвата (первое совпадение шаблона в скобках). Поэтому, возможно, попробуйте:

my name used to be \1

или же

my name used to be $1

ОБНОВЛЕНИЕ: Как указали несколько человек, ваш исходный шаблон захвата является неправильным и будет захватывать только последнюю букву имени, а не полное имя. Вы должны использовать следующий шаблон для захвата всех букв имени:

my name is (\w+)

Ответ 2

Кстати, в вопросе выше:

Для:

Hello, my name is bob

Найти часть:

my name is (\w)+

С заменой части:

my name used to be \1

Вернется:

Hello, my name used to be b

Изменить часть поиска на:

my name is (\w+)

И заменить будет то, что вы ожидаете:

Hello, my name used to be bob

Пока (\ w) + будет соответствовать "bob", это не группировка, которую вы хотите заменить.

Ответ 3

Используйте() круглые скобки в строке поиска

Важно подчеркнуть! Все сопоставленные сегменты в строке поиска, которые вы хотите использовать в заменяющей строке, должны быть охвачены скобками(), в противном случае эти согласованные сегменты не будут доступны с такими переменными, как $1, $2,... и \1,\2,.. и т.д.

Пример:

Мы хотим заменить 'em' на 'px', но сохраним числовые значения:

margin: 10em
margin: 2em

Таким образом, мы используем margin: $1px как заменяющую строку.


ПРАВИЛЬНО: Объявите желаемый сегмент $1 в скобках ( ) следующим образом:

НАЙТИ: margin: ([0-9]*)em (С круглыми скобками)

ЗАМЕНИТЕ: margin: $1px

РЕЗУЛЬТАТ:

margin: 10px
margin: 2px

НЕПРАВИЛЬНО: Следующий шаблон регулярного выражения будет соответствовать желаемым строкам, но совпадающие сегменты не будут доступны в замененной строке в качестве таких переменных, как $1:

НАЙТИ: margin: [0-9]*em (Без круглых скобок)

ЗАМЕНИТЕ: margin: $1px

РЕЗУЛЬТАТ: ($1 - undefined)

margin: px
margin: px

Ответ 4

Вот визуальная презентация одобренного ответа.

введите описание изображения здесь

Ответ 5

Обратите внимание, что если вы используете более 9 групп захвата, вы должны использовать синтаксис ${10}.

$10 или \10 или \{10} работают не.

Ответ 6

Глядя на статью Sublime Text неофициальную документацию по поиску и замене, кажется, что +(.+) - это группа захвата, которую вы можете захотеть... но я лично использовал (.*) И она работала хорошо. Чтобы ЗАМЕНИТЬ, как вы говорите, вам может понравиться этот разговор на форумах, в частности, этот пост, в котором говорится, что просто используйте $1 для использования первой захваченной группы.

И поскольку картинки лучше слов...

До: before find/replace

После: after find/replace