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.
