Регулярное выражение поиска заменить в Sublime Text 2

321

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

Hello my name is bob

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

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

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

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

Теги:
replace
sublimetext2

5 ответов

471
Лучший ответ

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

my name used to be \1

или

my name used to be $1

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

my name is (\w+)
  • 42
    Оба из них будут работать в Sublime Text.
  • 12
    кроме разве это не $0 ?
Показать ещё 9 комментариев
93

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

Для:

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", это не группировка, которую вы хотите заменить.

34

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

Важно подчеркнуть! Все сопоставленные сегменты в строке поиска, которые вы хотите использовать в заменяющей строке, должны быть охвачены скобками(), в противном случае эти согласованные сегменты не будут доступны с такими переменными, как $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
  • 1
    Спасибо, этот ответ действительно указывает на интересный факт, который решил мою проблему.
19

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

Изображение 4736

13

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню