Регекс VSCode знайти та замінити математику підматчу?


209
%s@{fileID: \(213[0-9]*\)@\='{fileID: '.(submatch(1)-1900)@

Я використовую цю команду пошуку та заміни регулярних виразів у vim, щоб відняти константу з кожного відповідного ідентифікатора.

Я можу знайти регулярний вираз у VSCode, але як я можу посилатись на submatchматематику та замінити? submatch(1)не працює у VSCode?

Дякую.

Відповіді:


350

Враховуючи регулярний вираз, (foobar)ви можете посилатися на першу групу, використовуючи $1і так далі, якщо у полі введення заміни є більше груп.


запитайте знову по-різному тут: stackoverflow.com/questions/35283300/…
Ракка Rage

5
Я повинен був замінити <p>(.*)</p>з <p>\n\t\t\t\t\t\t$1\n\t\t\t\t\t</p>для файлу у 2000 лінії. Уявіть, що я це роблю вручну.
Bishwas Mishra

101

Щоб додати відповідь Бенджаміна на прикладі:

Find        Carrots(With)Dip(Are)Yummy
Replace     Bananas$1Mustard$2Gross
Result      BananasWithMustardAreGross

Що-небудь в дужках може бути регулярним виразом.


Цей нагадав мені, що я повинен уникати круглих дужок, якщо я роблю регулярний вираз на оператор if
Годинник

67

Просто додати ще один приклад:

Я замінював src attr у тегах htg html, але мені потрібно було замінити лише src та зберегти будь-який текст між декларацією img та атрибутом src.

Я використовував інструмент пошуку + заміни (ctrl + h), як на зображенні: Знайдіть і замініть


8
для мене це працює непослідовно - хоча вилки вилок правильні, вихід іноді залишається $1без заміни
godblessstrawberry

1
Привіт, @godblessstrawberry, ти можеш поділитися рядками пошуку та заміни?
Діого Пасхоаль

2
привіт @Diogo Я намагався замінити projectwide \[innerHtml\]\s*=\s*"'(.*)'\s*\|\s*translate\s*"з myTranslate="$1"і пропускав ключі випадковим чином і вставка $ 1 замість значення групи іноді. оновлення до 1.28.0 вирішило цю проблему
godblessstrawberry

Я зіткнувся з тією ж проблемою, що і @godblessstrawberry, роблячи глобальну заміну в усіх моїх файлах регексом '(і | або \ + | \ -) ​​\ n (*)' та рядком заміни '\ n $ 2 $ 1' іноді правильно перемістив двійковий оператор на початок нового рядка, але в інших випадках просто вставив $ 2 $ 1. Здавалося б, помилка у VSCodium
Tom Close

@godblessstrawberry, перевірте це: github.com/microsoft/vscode/isissue/81825 . Якщо це не стосується вас, надайте більше інформації та відкрийте там проблему.
Діого Пасхоаль

10

У моєму випадку $ 1 не працював, але 0 доларів працює для моєї мети.

У цьому випадку я намагався замінити рядки на правильний формат, щоб перекласти їх у Laravel, я сподіваюся, що це може бути корисним комусь іншому, тому що мені знадобилося деякий час, щоб розібратися в цьому!

Search: (?<=<div>).*?(?=</div>)
Replace: {{ __('$0') }}

Regex Замініть рядок для перекладу Laravel


1
Чи можливо це для вас скопіювати редагування своєї публікації та скопіювати код замість зображення? Краще для візуалізації.
Панквуд

3

Для початківців прийнята відповідь є правильною, але трохи лаконічною, якщо ви не так знайомі ні з VSC, ні з Regex.

Отже, якщо це ваш перший контакт з будь-яким:

Щоб знайти та змінити текст,

  1. На кроці "Знайти" ви можете використовувати регулярний вираз із "захопленням груп", наприклад I want to find (group1) and (group2), використовуючи дужки. Це знайде той самий текст, що і текст I want to find group1 and group2, але з тією різницею, на яку ви можете посилатися, group1і group2на наступному кроці:

  2. У «Replace» крок, ви можете звернутися до захопленим групам з допомогою $1, і $2т.д., так що ви могли б змінити вирок I found $1 and $2 having a picnic, який буде виводитиI found group1 and group2 having a picnic.

Примітки:

  • Замість простого рядка що-небудь всередині або зовні ()може бути регулярним виразом.

  • $0 стосується всього матчу


2

Ще один простий приклад:

Search: style="(.+?)"
Replace: css={css`$1`}

Корисно для перетворення HTML в JSX з емоцією / css!

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