typescript - Varför fungerar inte detta regex i vscode men fungerar på en annan sida?


Jag vet inte mycket om regex, men jag försöker använda detta regex som gjorts av chatGPT i vscode men det ger inget resultat. Men när jag försöker använda det på en annan sida som https://regex101.com/, matchar strängen.

Regex :

throw\s+new\s+ApiResponseError\s*\(\s*HttpStatusCode\.([^,]+),\s*('[^']*'|"[^"]*"),\s*new\s+Error\(`([^`]*)`\),\s*(true|false)?\s*\)

Mönster som matchar på webbplatsen:

                throw new ApiResponseError(
                    HttpStatusCode.BAD_REQUEST,
                    'low',
                    new Error(`Required parameters of the '${worksheetDefinitions.worksheetName}' worksheet were not informed`),
                    false
                )

Observera de tomma utrymmena, jag behöver dem i regex också.

Finns det någon konfiguration jag behöver göra?

Jag försökte ändra regex, söka efter lösningar men det fortsätter att inte returnera något. Jag förväntade mig att regex skulle fungera som på sidan.

Svar #1

Du kan få vilken regex som helst i Visual Studio Code att matcha över radbrytningar om du anger \n{0} någonstans i mönstret, de mest bekväma platserna är början och slutet av mönstret. Jag skulle rekommendera att sätta det i början för att inte bryta några specifika regex-konstruktioner om du inte är så bekant med reguljära uttryck.

Så, regeln är \n{0} + YOUR_REGEX.

VSCode:s regexmotor kräver att \n finns i mönstret så att vilken konstruktion som helst som \s eller [^"] kan matcha radbrytnings-tecken, och att definiera ett mönster för att "matcha noll nya rader" gör jobbet.

I ditt fall kan du använda

\n{0}throw\s+new\s+ApiResponseError\s*\(\s*HttpStatusCode\.([^,]+),\s*('[^']*'|"[^"]*"),\s*new\s+Error\(`([^`]*)`\),\s*(true|false)?\s*\)
^^^^^

Om du har andra problem med att matcha någon karaktär med ett VSCode-regex, se Flerlinjiga reguljära uttryck i Visual Studio Code.

Svar #2

Lägg till [\s\n]* till ditt regex så här:

throw\s+new\s+ApiResponseError[\s\n]*\(\s*HttpStatusCode\.([^,]+),\s*('[^']*'|"[^"]*"),\s*new\s+Error\(`([^`]*)`\),\s*(true|false)?\s*\)

vilket som @Wiktor nämnde är nödvändigt eftersom vscode hanterar radbrytningar på ett annat sätt än regex-motorer. Av prestandaskäl måste du uttryckligen tala om för vscode att leta efter radbrytningar med en bokstavlig \n och inte bara \s (vilket annars skulle inkludera radbrytningar men inte gör det här i vscode).

Så att använda [\s\n]* säger till vscode att leta efter radbrytningar samt de andra \s-operationerna.

Relaterade artiklar