Jaki smak Regex jest używany w programie Visual Studio Code?

137

Próbując zastąpić wyszukiwanie w programie Visual Studio Code, stwierdzam, że jego smak Regex różni się od pełnego programu Visual Studio. W szczególności próbuję zadeklarować nazwaną grupę, z string (?<p>[\w]+)którą działa w programie Visual Studio, ale nie w Visual Studio Code. Będzie narzekać z błędem Invalid group.

Oprócz rozwiązania tego konkretnego problemu szukam informacji na temat smaku Regexes w Visual Studio Code i gdzie znaleźć dokumentację na ten temat, aby móc odpowiedzieć sobie na inne pytania, na które mogę się natknąć.

W pełnym programie Visual Studio używane są wyrażenia regularne platformy .NET, jak opisano tutaj . Ten link jest wymieniony jako dokumentacja dla VS Code w innym miejscu w Stackoverflow, ale tak nie jest.

Eric
źródło
VSCode korzysta z silnika regex opartego na JavaScript, ale to nie to samo. Nie możesz tam używać nazwanych grup przechwytywania.
Wiktor Stribiżew
1
Nie ma określonej dokumentacji dotyczącej wyrażenia regularnego używanego w VSCode. Jeśli jednak spojrzysz na kod źródłowy , zobaczysz dużo kodu JS. Jeśli spróbujesz użyć lookbehinds, otrzymasz błąd nieprawidłowego wzoru, podczas gdy lookahead działa. A styl JS regex jest jedynym silnikiem regex, który traktuje [^]wzorzec jako pasujący do dowolnego symbolu. Jest więc jasne, że jest to silnik JS regex.
Wiktor Stribiżew
5
Standardem jest ECMAScript 5 .
Wiktor Stribiżew
1
OK. Cóż, jeśli jesteś pewien i masz linki do dokumentów, na które możesz odpowiedzieć. Głosuję za. Nie myśl jednak, że specyfikacja ECMAScript jest świetnym łączem, jeśli jest jedyna.
Eric
1
Więc jakiej odpowiedzi oczekujesz? Wszystko, co zamieściłem powyżej + link do opisu składni wyrażenia regularnego JS? Jak odniesienie do MDN ?
Wiktor Stribiżew

Odpowiedzi:

177

Rust Regex na pasku bocznym Znajdź / zamień w plikach

Rob Lourens z MSFT napisał, że wyszukiwanie plików używa wyrażenia regularnego Rust. Dokumentacja języka Rust opisuje składnię.

Rob Lourens na GitHub

JavaScript Regex w widżecie Znajdź / zamień w pliku

Alexandru Dima z MSFT napisał, że widget wyszukiwania używa wyrażenia regularnego JavaScript. Jak skomentował Wicktor, dokumentacja ECMAScript 5 opisuje składnię. Podobnie jest z Przewodnikiem po wyrażeniach regularnych JavaScript w MDN .

Alexandru Dima na GitHubie

Sprawdź różnicę

Pasek boczny znajdowania w plikach nie obsługuje, (?=foobar)podczas gdy widżet znajdowania w pliku obsługuje tę składnię wyszukiwania w przód.

Pokazuje lookahead działający w widgecie, ale nie na pasku bocznym.

Odnośnie Znajdź / Zamień grupami

Aby znaleźć / zastąpić grupami, użyj nawiasów ()do grupowania i $1, $2, $3, $naby zastąpić.

Oto przykład.

Przed:

To jest tekst przed zamianą.

Po:

To jest tekst po zamianie.

Shaun Luttin
źródło
13

Odpowiedź Shauna jest nadal poprawna, jednak aby dodać aktualizację, ostatnio VS Code dodał opcję wyrażenia zgody na używanie silnika PCRE2 opartego na Perlu . Możesz to włączyć za pomocą konfiguracji ustawień.

Pozwala to na wykonywanie bardziej zaawansowanych operacji regex, takich jak lookaheads i backreferences . Ale jak zauważono poniżej, wyrażenie regularne nadal musi być poprawnym wyrażeniem regularnym JavaScript .

VS Code obsługuje wyszukiwanie wyrażeń regularnych, jednak odwołania wsteczne i przeszukiwanie nie są obsługiwane domyślnie. Ale możesz je włączyć za pomocą ustawienia search.usePCRE2 . To konfiguruje ripgrep do używania silnika regex PCRE2. Chociaż PCRE2 obsługuje wiele innych funkcji, obsługujemy tylko wyrażenia regex, które są nadal prawidłowe w JavaScript , ponieważ otwarte edytory są nadal przeszukiwane za pomocą wyszukiwania opartego na JavaScript edytora.

A na bonus, jeśli wylądowałeś tutaj, próbując wyszukiwać w wielu wierszach, VS Code niedawno dodał tę funkcję !

wprowadź opis obrazu tutaj

protoEvangelion
źródło
PCRE2 można aktywować w menu ustawień. Przejdź do Preferencje ~ Ustawienia i wyszukaj „regex”
DougR
Wygląda na to, że to ustawienie jest przestarzałe , a PCRE2 jest automatycznie używany jako rezerwowy, gdy domyślny silnik nie obsługuje funkcji.
Kevin Rak