Как вы ссылаетесь на группу захвата с помощью поиска и замены регулярных выражений в Visual Studio 2012, 2013, 2015 и VS Code

255

Я понимаю, что есть множество вопросов по этому поводу, но ни один из тех, что я нашел, конкретно не ссылался на версию VS, на которую они ссылались. Из-за недостатка этой важной информации я все еще не мог успешно использовать найденные ответы. Наиболее распространенным был

  • Окружить с помощью {}, отобразить захват с помощью \ 1, \ 2, \ n

Однако это, похоже, старый метод поиска и замены регулярных выражений в Visual Studio, и он не работает в VS 2012.

SgtPooki
источник
1
Это не так сложно найти в справке: в диалоге поиска / замены F1; в начале поиска и замены текста есть ссылка на Использование регулярных выражений в VS ; там второй совет отсылает вас к подстановкам в регулярных выражениях ; там он дает вам основы и говорит, что есть больше деталей в разделе Замена пронумерованной группы и Замена именованной группы .
PJTraill
2
@PJTraill Приятно знать, что им было легче ответить на вопрос для их версии 2012 года где-то между 2013 и 2015 годами. Хотя, судя по голосам, я думаю, что совершенно очевидно, что все еще не «не так уж сложно» найти помощь. IMO: Если поиск и голосование по статье переполнения стека проще, чем использование поиска, замены, захвата без поиска помощи вообще, тогда это намного сложнее, чем должно быть.
SgtPooki
Что меня беспокоит в MSVS 2012/3, так это два разных диалога поиска / замены, в частности, меньший (Ctrl-H), в котором я случайно (с нажатиями клавиш, вероятно, что-то другое) изменяю область поиска , Но я хочу подчеркнуть, что в более крупном диалоге (Ctrl-Shift-H) после полей «Найти» и «Заменить» есть кнопки, которые дают вам список наиболее важных возможностей, в том числе того, что вы ищете, поэтому нужна помощь! Я предполагаю, что многие люди либо не замечают кнопки, ни попадают в диалог Ctrl-H и не могут их видеть.
PJTraill
Я согласен, что помощь немного беспокоит; Я подозреваю, что они отдают приоритет поиску простого текста. Моя точка зрения заключается в том, что если кто-то знает или предполагает, что он должен быть, он может найти его достаточно легко; все чаще и чаще я следую этому пути, так как предпочитаю использовать каноническую документацию, как только смогу ее найти. Я не хотел звучать унизительно; Я считаю, что это «слишком сложно» и «не слишком сложно» - они не являются противоположностями, если вы видите «не слишком» как квалификацию «трудно» и добавляете в ответ неявное «трудно для чего?».
PJTraill
Я «знал», что теги REGEXP используют «()», перечитал документацию, и это не сработало ... поэтому я пришел сюда, чтобы убедиться ... потом я провел еще несколько экспериментов, и это сработало. Поэтому ИМХО документация MSDN должна быть очень ясной, чтобы («) использовались для« тегирования »выражения, для тех из нас, кому приходилось изучать старую номенклатуру« тегов »VS6. Было бы хорошо, если бы они могли использовать ту же самую номенклатуру. Нумерованные группы ... просто не достаточно хорошо запускают синапсы ИМХО.
Росс Янгблад

Ответы:

356

Чтобы найти и заменить в VS 2012 и VS 2015, вы делаете следующее:

Пример (спасибо syonip)

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

_platformActions.InstallApp\((.+)\)

И следующий текст, чтобы заменить его:

this.Platform().App($1).Install()

Примечание. Как указывает SLaks в комментарии ниже, изменение синтаксиса регулярных выражений связано с переходом VS2012 на стандартный механизм регулярных выражений .Net.

Примечание. Другой комментатор отметил, что это работает и в коде Visual Studio (vscode).

SgtPooki
источник
10
Чтобы быть более общим, VS2012 теперь использует стандартный механизм регулярных выражений .Net.
SLaks
4
Разве вам не нужно избегать символа чар между _platformActionsи InstallApp?
rory.ap
Думая об этом сейчас, это имело бы смысл. Я не проверял это. Не стесняйтесь добавить туда правку.
SgtPooki
1
В конце концов, я использовал названный, поскольку числовое значение, кажется, не работает для меня по крайней мере. (?<rval>.+)в поиске и замене${rval}
Марк Шультхайс
2
Некоторая дополнительная помощь: если вы хотите заменить вещь (. *) На вещь $ 18 (добавив '8' непосредственно после захвата), вам придется использовать вещь $ {1} 8
Люк Блум
17

Чтобы добавить пример этого, вот что я должен был сделать в своем коде:

Найти то, что:

_platformActions.InstallApp\((.+)\)

Заменить:

this.Platform().App($1).Install()

Это заменяет любой вызов InstallApp (x) на this.Platform (). App (x) .Install ().

* Не забудьте пометить «Использовать регулярные выражения» в параметрах поиска

syonip
источник
10

Если вы хотите работать с использованием имен групп (используя тот же пример, что и выше):

Найти то, что:

_platformActions\.InstallApp\((?<mygroupname>.+)\)

Заменить:

this.Platform().App(${mygroupname}).Install()
Yepeekai
источник
9

Чтобы улучшить ответы выше: вы должны заменить

_platformActions.InstallApp\((.+)\)

с участием

this.Platform().App(${1}).Install()

Запомните $ {1}, если вы хотите добавить число после захвата. $18попробую вставить 18-й поисковый захват, а не первый с 8добавленным.

Люк Блум
источник