typescript - Mengapa regex ini tidak bekerja di vscode tetapi bekerja di situs lain?


Saya tidak terlalu tahu banyak tentang regex, tapi saya mencoba menggunakan regex ini yang dibuat oleh chatGPT di vscode tetapi tidak menghasilkan apa pun sebagai hasil. Namun ketika saya mencoba menggunakannya di situs lain seperti https://regex101.com/, string tersebut cocok.

Regex :

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

Polanya yang cocok di situs:

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

Perhatikan spasi kosongnya, saya juga membutuhkannya dalam regex.

Apakah ada konfigurasi yang perlu saya lakukan?

Saya mencoba mengubah regex, mencari solusi tetapi itu terus mengembalikan nol. Saya mengharapkan regex bekerja seperti di situs tersebut.

Jawaban #1

Anda dapat membuat regex apa pun untuk Visual Studio Code cocok melintasi pemisah baris jika Anda menentukan \n{0} di mana pun di dalam pola, tempat yang paling nyaman adalah di awal dan akhir pola. Saya menyarankan meletakkannya di awal agar tidak merusak konstruk regex tertentu jika Anda tidak terlalu familiar dengan ekspresi reguler.

Jadi, aturannya adalah \n{0} + YOUR_REGEX.

Mesin regex VSCode memerlukan \n untuk hadir dalam pola sehingga konstruk apa pun seperti \s atau [^"] dapat mencocokkan karakter baris baru, dan mendefinisikan pola "cocokkan nol baris baru" melakukan tugas tersebut.

Dalam kasus Anda, Anda dapat menggunakan

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

Jika Anda memiliki masalah lain dalam mencocokkan karakter apa pun dengan regex VSCode, lihat Ekspresi reguler multi-baris di Visual Studio Code.

Jawaban #2

Tambahkan [\s\n]* ke regex Anda seperti ini:

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

yang seperti yang disebutkan @Wiktor diperlukan karena vscode menangani baris baru dengan cara yang berbeda daripada mesin regex. Untuk alasan performa, Anda perlu secara eksplisit memberitahu vscode untuk mencari baris baru dengan literal \n bukan hanya \s (yang seharusnya bisa menyertakan baris baru tetapi di vscode tidak demikian).

Jadi menggunakan [\s\n]* memberitahu vscode untuk mencari baris baru serta operasi \s lainnya.

Artikel terkait