Регулярний пошук виразів замінити в Sublime Text 2


440

Я хочу зробити пошук замінити регулярними виразами в піднесеному тексті 2. Документація щодо цього є досить анемічною. Зокрема, я хочу зробити заміну на групи, щоб щось на зразок перетворення цього тексту:

Hello my name is bob

І цей пошуковий термін:

Знайти що: my name is (\w)+

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

Пошуковий термін працює чудово, але я не можу знайти спосіб насправді зробити заміну за допомогою групи regexp.

Відповіді:


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використовується як вихід для символу з кодовою точкою ddd). Однак, $0схоже, він використовується в Sublime2 як "позначка виходу" відповідно до цієї сторінки (хоча у мене виникають проблеми з пошуком достатньої кількості прикладів, щоб зрозуміти, як саме використовується позначка виходу в Sublime2).
Bobulous

3
Знак виходу $0використовується в Sublime Text 2/3 для розміщення курсору при виході з фрагмента розширення. Детальніше про фрагменти .
jrhorn424

2
$ 0 все ще працює для зворотного посилання на весь вираз у Sublime Text 2
sturrockad

2
$0- це цілий збіг регулярних виразів; $1є першою групою захоплення.
Олета

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 у Піднесеному 3.
Джефрі

47

Ось наочна презентація затвердженої відповіді.

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


чому не знаходить $_SESSION[(\w+)? дякую
Тоні Мішель Каубе

Оскільки $, [, (і і) є спеціальними символами, тому вам слід уникати кожного спеціального символу за допомогою зворотної косої риски.
zeeawan

25

Зауважте, що якщо ви використовуєте більше 9 груп захоплення, ви повинні використовувати синтаксис ${10}.

$10або \10або \{10}буде НЕ працювати.


Дякую! Це було корисно для мене, щоб замінити та додати число до кінця захопленої групи, наприклад, щоб додати a 1до другої групи захоплення, вам потрібно використовувати дужки типу ${2}1; $ 21 відноситься до 21-ї групи захоплення, якої не існує.
Ерік

1

Дивлячись на статтю неофіційної документації Sublime Text про пошук і заміну , схоже, +(.+)це група захоплення, яку ви могли б захотіти ... але я особисто використовував (.*)це, і це працювало добре. Щоб ЗАМОВИТИ так, як ви говорите, вам може сподобатися ця розмова на форумах , зокрема в цій публікації, в якій сказано просто використовувати $1для використання першої захопленої групи.

А оскільки картинки кращі за слова ...

Перед: перед тим, як знайти / замінити

Після: після пошуку / заміни

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.