تايبسكريبت - لماذا هذا التعبير النمطي لا يعمل في VSCode ولكنه يعمل في موقع آخر؟


لا أعرف الكثير عن التعبيرات النمطية (regex)، لكنني أحاول استخدام هذا التعبير النمطي الذي صنعه chatGPT في vscode لكنه لا يعيد أي نتيجة. ولكن عندما أحاول استخدامه في موقع آخر مثل https://regex101.com/، تتطابق السلسلة.

التعبيرات النمطية :

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

النمط الذي يتطابق في الموقع:

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

لاحظ الفراغات، أنا بحاجة إليها في التعابير النمطية أيضًا.

هل هناك أي إعدادات أحتاج للقيام بها؟

حاولت تغيير التعبير النمطي، والبحث عن حلول لكنه يستمر في عدم إرجاع أي شيء. كنت أتوقع أن يعمل التعبير النمطي كما في الموقع.

الإجابة رقم 1

يمكنك جعل أي تعبير منتظم في برنامج Visual Studio Code يتطابق عبر فواصل الأسطر إذا حددت \n{0} في أي مكان داخل النمط، أما الأماكن الأكثر ملاءمة فهي بداية ونهاية النمط. أوصي بوضعه في البداية حتى لا يتم كسر أي تراكيب تعبير منتظم محددة إذا لم تكن معتادًا على التعابير النظامية كثيرًا.

إذن، القاعدة هي \n{0} + YOUR_REGEX.

محرك التعبيرات النمطية في VSCode يتطلب وجود \n في النمط بحيث يمكن لأي بنية مثل \s أو [^"] مطابقة أحرف نهاية السطر، وتعريف نمط "مطابقة صفر من الأسطر الجديدة" يؤدي المهمة.

في حالتك، يمكنك استخدام

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

إذا كانت لديك مشكلات أخرى في مطابقة أي حرف باستخدام تعبير عادي في VSCode، انظر التعابير العادية متعددة الأسطر في Visual Studio Code.

الإجابة رقم 2

أضف [\s\n]* إلى تعبيرك النمطي هكذا:

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

كما ذكر @Wiktor، هذا ضروري لأن vscode يتعامل مع الأسطر الجديدة بطريقة مختلفة عن محركات التعبيرات النمطية. لأسباب تتعلق بالأداء، تحتاج إلى إخبار vscode صراحة بالبحث عن الأسطر الجديدة باستخدام \n حرفيًا وليس مجرد \s (والذي عادةً ما يشمل الأسطر الجديدة ولكنه لا يفعل ذلك هنا في vscode).

لذلك، استخدام [\s\n]* يخبر vscode بالبحث عن فواصل الأسطر بالإضافة إلى عمليات \s الأخرى.