typescript - Prečo tento regex nefunguje vo vscode, ale funguje na inej stránke?


Neviem veľa o regulárnych výrazoch, ale snažím sa použiť tento regulárny výraz vytvorený chatGPT vo VSCode, ale nevracia žiadny výsledok. Keď ho však skúšam použiť na inej stránke ako https://regex101.com/, reťazec sedí.

Regex :

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

Vzor, ktorý sa zhoduje na stránke:

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

Všimnite si prázdne priestory, potrebujem ich aj v regulárnom výraze.

Je potrebné niečo konfigurovať?

Skúsil som zmeniť regulárny výraz, hľadať riešenia, ale stále nič nevracia. Očakával som, že regulárny výraz bude fungovať ako na stránke.

Odpoveď č. 1

Môžete vytvoriť akýkoľvek regex pre Visual Studio Code, ktorý bude zodpovedať aj cez zlomy riadkov, ak uvediete \n{0} kdekoľvek v rámci vzoru, najvhodnejšie miesta sú na začiatku a na konci vzoru. Odporúčal by som dať to na začiatok, aby sa nepoškodili žiadne konkrétne regexové konštrukcie, ak nie ste príliš oboznámení s regulárnymi výrazmi.

Takže pravidlo je \n{0} + YOUR_REGEX.

Regex engine vo VSCode vyžaduje, aby bolo v vzore prítomné \n, aby mohol akýkoľvek konštrukt ako \s alebo [^"] zhodať znaky konca riadku, a definovanie vzoru „zhoda žiadnych nových riadkov“ splní túto úlohu.

Vo vašom prípade môžete použiť

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

Ak máte ďalšie problémy so zhodovaním akejkoľvek postavy pomocou regulárneho výrazu vo VSCode, pozrite si Viacriadkové regulárne výrazy vo Visual Studio Code.

Odpoveď č. 2

Pridajte [\s\n]* do vášho regexu takto:

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

čo, ako spomenul @Wiktor, je potrebné, pretože vscode spracováva nové riadky inak ako regex enginy. Z dôvodov výkonu musíte explicitne povedať vscode, aby hľadal nové riadky s doslovným \n, nie len \s (čo by inak zahrnulo nové riadky, ale tu vo vscode nie).

Takže použitie [\s\n]* hovorí VSCode, aby hľadal aj nové riadky, ako aj ostatné operácie \s.

Súvisiace články