Поиск замещения регулярного выражения в 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]()