Какой вид Regex использует Visual Studio Code?

130

Пытаясь выполнить поиск-замену в Visual Studio Code, я обнаружил, что его версия Regex отличается от полноценной Visual Studio. В частности, я пытаюсь объявить именованную группу, с string (?<p>[\w]+)которой работает в Visual Studio, но не в Visual Studio Code. Он пожалуется на ошибку Invalid group.

Помимо решения этой конкретной проблемы, я ищу информацию об особенностях регулярных выражений в коде Visual Studio и о том, где найти документацию по этому поводу, чтобы я мог помочь себе с любыми другими вопросами, на которые я могу наткнуться.

Полная версия Visual Studio использует регулярные выражения .NET, как описано здесь . Эта ссылка упоминается как документация для VS Code в другом месте на Stackoverflow, но это не так.

Эрик
источник
VSCode использует движок регулярных выражений на основе JavaScript, но это не то же самое. Вы не можете использовать там именованные группы захвата.
Wiktor Stribiew
1
Нет специальной документации по регулярному выражению, используемому в VSCode. Однако, если вы посмотрите на исходный код , вы увидите много JS-кода. Если вы попытаетесь использовать просмотр назад, вы получите ошибку неверного шаблона, в то время как просмотр вперед будет работать. И разновидность регулярных выражений JS - единственный движок регулярных выражений, который обрабатывает [^]шаблон как соответствующий любому символу. Итак, ясно, что это движок регулярных выражений JS.
Wiktor Stribiew
5
Стандарт - ECMAScript 5 .
Wiktor Stribiew
1
ХОРОШО. Что ж, если вы уверены и у вас есть ссылки на документы, вы можете ответить. Я буду голосовать за. Не думайте, что спецификация ECMAScript - отличная ссылка, если она единственная.
Эрик
1
Итак, какого ответа вы ожидаете? Все, что я опубликовал выше + ссылка на описание синтаксиса JS regex? Нравится ссылка на MDN ?
Wiktor Stribiew

Ответы:

171

Rust Regex на боковой панели поиска / замены в файлах

Роб Лоуренс из MSFT написал, что для поиска файлов используется регулярное выражение Rust. Документация по языку Rust описывает синтаксис.

Роб Лоренс на GitHub

JavaScript Regex в виджете "Найти / заменить в файле"

Александру Дима из MSFT написал, что виджет поиска использует регулярное выражение JavaScript. Как прокомментировал Виктор, документация ECMAScript 5 описывает синтаксис. То же самое и в Руководстве по регулярным выражениям JavaScript в MDN .

Александру Дима на GitHub

Проверить разницу

Боковая панель поиска в файлах не поддерживает, (?=foobar)тогда как виджет поиска в файле поддерживает этот синтаксис просмотра вперед.

Показывает просмотр вперед, работающий в виджете, но не на боковой панели.

Что касается поиска / замены с группами

Для поиска / замены с группами, использование скобок ()в группе и $1, $2, $3, $nзаменить.

Вот пример.

Перед:

Это текст перед заменой.

После:

Это текст после замены.

Шон Латтин
источник
12

Ответ Шона по- прежнему верен, однако, чтобы добавить обновление, недавно VS Code добавил возможность выбрать использование движка PCRE2 на основе Perl . Вы можете включить это в настройках config.

Это позволяет вам выполнять более сложные операции с регулярными выражениями, такие как просмотр вперед и обратные ссылки . Но, как указано ниже, регулярное выражение по-прежнему должно быть действительным регулярным выражением JavaScript .

VS Code поддерживает поиск по регулярным выражениям, однако обратные ссылки и поиск по умолчанию не поддерживаются. Но вы можете включить их с помощью настройки search.usePCRE2 . Это настраивает ripgrep для использования механизма регулярных выражений PCRE2. Хотя PCRE2 поддерживает многие другие функции, мы поддерживаем только регулярные выражения, которые все еще действительны в JavaScript , потому что поиск в открытых редакторах по-прежнему выполняется с помощью поиска редактора на основе JavaScript.

И в качестве бонуса, если вы закончили здесь, пытаясь выполнять многострочный поиск, VS Code недавно также добавил эту функцию !

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

protoEvangelion
источник
PCRE2 можно активировать в меню настроек. Перейдите в Настройки ~ Настройки и найдите 'regex'
DougR
Похоже, что этот параметр устарел , и PCRE2 автоматически используется как резерв, если механизм по умолчанию не поддерживает функцию.
Кевин Рак,