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


440

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

Hello my name is bob

И этот поисковый термин:

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

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

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

Ответы:


584

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

my name used to be \1

или

my name used to be $1

Также обратите внимание, что ваш оригинальный шаблон захвата:

my name is (\w)+

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

my name is (\w+)

15
кроме разве нет $0?
Skylar Saveland

11
Нет, $ 0 не используется в качестве обратной ссылки в регулярном выражении (потому что \0равно нулевому символу и \0dddиспользуется как escape для символа с кодовой точкой ddd). Тем $0не менее, похоже, что используется в Sublime2 в качестве «метки выхода» в соответствии с этой страницей (хотя у меня возникают проблемы с поиском достаточного количества примеров, чтобы понять, как именно используется метка выхода в Sublime2).
Великолепно

3
Метка выхода $0используется в Sublime Text 2/3, чтобы поместить курсор при выходе из расширения фрагмента. Больше на отрывках .
jrhorn424

2
$ 0 по-прежнему работает для обратной ссылки на все выражение в Sublime Text 2
sturrockad

2
$0это полное совпадение с регулярным выражением; $1первая группа захвата.
Oletha

103

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

За:

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


52

Важно: используйте ( )скобки в строке поиска

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

Например, мы хотим заменить «em» на «px», но сохранить цифровые значения:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • Строка замены: margin: $1pxилиmargin: \1px
  • Строка поиска (ПРАВИЛЬНО): margin: ([0-9]*)em// с круглыми скобками
  • Строка поиска (НЕПРАВИЛЬНО): margin: [0-9]*em

ПРИМЕР ПРАВИЛЬНОГО СЛУЧАЯ: Использование margin: ([0-9]*)emстроки поиска (с круглыми скобками). Заключите желаемый совпадающий сегмент (например, $1или \1) в ( )круглые скобки следующим образом:

  • Найти: margin: ([0-9]*)em(с круглыми скобками)
  • Заменить на: margin: $1pxилиmargin: \1px
  • Результат:
    margin: 10px;
    margin: 2px;

НЕПРАВИЛЬНЫЙ ПРИМЕР ПРИМЕРА: Использование margin: [0-9]*emстроки поиска (без скобок). Следующий шаблон регулярного выражения будет соответствовать желаемым строкам, но совпадающие сегменты не будут доступны в замененной строке в качестве переменных, таких как $1или \1:

  • Найти: margin: [0-9]*em(без скобок)
  • Заменить на: margin: $1pxилиmargin: \1px
  • Результат:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */

1
Спасибо, этот ответ действительно указывает на интересный факт, который решил мою проблему.
Enkk

Спасибо за указание на это. С помощью () я могу сделать замену на \ 1 в Sublime 3.
Джеффри

47

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

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


почему не находит $_SESSION[(\w+)? спасибо
Тони Мишель Каубе

Поскольку $, [, (, и) являются специальными символами, вы должны экранировать каждый специальный символ обратной косой чертой.
Zeeawan

25

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

$10или \10или не\{10} будет работать.


Спасибо! Это было полезно для меня, чтобы заменить и добавить номер в конец захваченной группы, например, чтобы добавить a 1ко второй группе захвата, вам нужно использовать такие фигурные скобки, как ${2}1; $ 21 относится к 21-й группе захвата, которая не существует.
Эрик

1

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

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

Перед: прежде чем найти / заменить

После: после найти / заменить

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.