VSCode Regex Find / Replace In Files: не удается получить пронумерованную группу захвата, за которой следуют числа для работы - PullRequest
2 голосов
/ 11 июля 2020

Мне нужно заменить это:

fixed variable 123

на это:

fixed variable 234

В VSCode это отлично подходит:

fixed(.*)123

Я могу ' t найти способ заставить его поместить захват в вывод, если следует число:

fixed$1234 

fixed${1}234

Но окно поиска и замены выглядит просто так:

enter image description here

I read that VSCode uses rust flavoured rexes.. Здесь означает, что ${1}234 должен работать, но VSCode просто помещает его в вывод ..

Пробовал именованный захват в стиле согласно здесь

fixed(?P<n>.*)123     //"invalid regular expression" error

Кажется, VSCode не понимает ${1}: enter image description here


ps; I appreciate I could hack it in the contrived example with

FIND: fixed (.*) 123
REPL: fixed $1 234

And this does work in vscode:

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

но не все мои данные всегда имеют один и тот же символ перед числом

Ответы [ 2 ]

3 голосов
/ 11 июля 2020
• 1000 *.

Я перепробовал весь синтаксис обратной ссылки, описанный в Ссылка на заменяемые строки: сопоставленный текст и обратные ссылки . Оказалось, что ни один из \g<1>, \g{1}, ${1}, $<1>, $+{1}, и т.д. c. работай. Однако есть и другие обратные ссылки, например $' ( вставляет часть строки, которая следует за сопоставленной подстрокой ) или $` ( вставляет часть строки, которая предшествует сопоставленной подстроке. ). Однако эти две обратные ссылки не работают в функции поиска и замены файлов VS Code, они не вставляют текст при использовании в шаблоне замены.

Итак, мы можем использовать $` или $' в качестве пустых заполнителей в шаблоне замены .

Найти что : fix(.*?)123 Заменить на :

  • fix$'$1234
  • fix$`$1234

Или, как в моем предварительном тесте , уже предоставленном в Ответ Марка , «техническая» группа захвата, соответствующая пустой строке, (), можно ввести в шаблон, чтобы обратная ссылка на эту группу могла использоваться в качестве «защиты» перед последующей «значимой» обратной ссылкой:

Find What : fixed()(.*)123 ( см. () в шаблоне, на который можно сослаться, используя $1) Заменить на : fixed$1$2234

Здесь $1 - это «защитный» заполнитель, позволяющий правильно анализировать $2 обратную ссылку.

Боковое примечание об именованных группах захвата

Именованные группы захвата поддерживаются , но вы должны использовать .NET / PCRE / Java синтаксис именованной группы захвата, (?<name>...). К сожалению, ни один из известных именованных обратных ссылок не работает. Я пробовал синтаксис $+{name} Boost / Perl, $<name>, ${name}, ничего не работает.

Заключение

Итак, здесь есть несколько проблем, которые необходимо адресовать:

  • Нам нужен синтаксис поддержки с однозначной нумерацией (\g<1>, ${1} или $<1>)
  • Нам нужно убедитесь, что $' или $` работают должным образом или анализируются как буквальный текст (то же самое, что $_ (используется для включения всей входной строки в заменяющую строку ) или $+ (используется для вставки текста, соответствующего группе захвата с наибольшим номером, которая фактически участвовала в сопоставлении ), обратные ссылки, которые не распознаются функцией поиска и замены файлов Visual Studio Code), текущее поведение, когда они не вставлять текст скорее не определено
  • Нам нужно ввести именованный синтаксис обратной ссылки (например, \g<name> или ${name}).
2 голосов
/ 11 июля 2020

После долгого расследования, проведенного мной и @Wiktor, мы обнаружили обходной путь для этой очевидной ошибки в поиске vscode (он же поиск по файлам) и заменили функциональность в указанном c случае, когда при замене следовала бы одна группа захвата. цифрами, например

$1234, где целью является заменить группой захвата 1 $1, за которой следует 234 или любые цифры. Но $1234 - это фактический нежелательный замененный вывод.

[Это отлично работает в виджете поиска / замены для текущего файла, но не в поиске / поиске по файлам.]

Есть (как минимум) два обходных пути. Использование двух последовательных групп, таких как $1$2234, работает правильно, как $ 1 $ `234 (или предшествует $ обратная кавычка).

Таким образом, вы можете создать фиктивную группу захвата, как в (.*?)()(\d{3}), где группа захвата 2 имеет ничего в нем просто для получения 2 последовательных групп захвата в замене или

используйте ваше исходное регулярное выражение поиска (.*?)(\d{3}), а затем используйте $ `непосредственно перед или после вашей« настоящей »группы захвата $ 1.

OP зарегистрировал проблему https://github.com/microsoft/vscode/issues/102221

Как ни странно, я только что обнаружил, что замена на один di git, например, $11, работает нормально, но как только вы добавляете два или более, она не работает, поэтому $112 не работает.

...