Фото від Growtika на Unsplash
Щоб зменшити зворотне відстеження у запитах з регулярними виразами, скористайтеся наступними стратегіями:
-
Використовуйте конкретні класи символів: замініть загальні шаблони, такі як
.*
, на більш конкретні класи символів. Наприклад, використовуйте[^']*
, щоб співпасти з будь-яким символом, крім одинарної лапки, замість.*[1]
. -
Уникайте жадібних квантифікаторів: використовуйте ледачі квантифікатори (
*?
,+?
) замість жадібних (*
або+
), коли це можливо. Це може значно зменшити зворотне відстеження, особливо для складних шаблонів [1]. -
Реалізуйте атомарні групи: використовуйте атомарне групування, щоб запобігти зворотному відстеженню в движку регулярних виразів. Наприклад, використовуйте
(?>pattern)
, щоб зробити групу атомарною [3]. -
Використовуйте присвоєні квантифікатори: застосовуйте присвоєні квантифікатори, такі як
x++
, замістьx+
, щоб зупинити зворотне відстеження для+
[5]. -
Використовуйте твердження вперед і назад: вони можуть бути ефективно використані для запобігання зайвому зворотному відстеженню [2].
-
Використовуйте неконвертуючі групи: реалізуйте
(?:pattern)
, коли захоплення не є необхідним, щоб уникнути зайвого розподілу пам'яті [2]. -
Уникайте вкладених квантифікаторів: вкладені квантифікатори можуть призвести до катастрофічного зворотного відстеження. Спробуйте переписати шаблони, щоб усунути вкладеність [2].
-
Використовуйте обмежені квантифікатори: застосовуйте синтаксис
{min,max}
, щоб обмежити кількість повторень підшаблону [1]. -
Розгляньте альтернативні реалізації регулярних виразів: для критичних застосунків подумайте про використання двигунів регулярних виразів без зворотного відстеження, таких як RE2 від Google або node-re2 [7].
-
Тщательно тестуйте ваші регулярні вирази: використовуйте інструменти, такі як Rex, щоб генерувати випадкові введення для тестування ваших регулярних виразів з невалідним, майже валідним і валідним введенням [6].
Застосовуючи ці техніки, ви можете створювати більш ефективні шаблони регулярних виразів, які менш схильні до катастрофічного зворотного відстеження та проблем із продуктивністю.
Джерела
[1] Preventing Regular Expression Backtracking in JavaScript https://plainenglish.io/blog/preventing-regular-expression-backtracking-in-javascript
[2] Catastrophic Backtracking | Regular Expressions Questions https://www.hellojavascript.info/docs/additional-questions/regular-expressions/catastrophic-backtracking
[3] Catastrophic Backtracking — Runaway Regular Expressions https://www.regular-expressions.info/catastrophic.html
[4] Backtracking in .NET regular expressions — Microsoft Learn https://learn.microsoft.com/en-us/dotnet/standard/base-types/backtracking-in-regular-expressions?redirectedfrom=MSDN
[5] Catastrophic backtracking — The Modern JavaScript Tutorial https://javascript.info/regexp-catastrophic-backtracking
[6] Best Practices for Regular Expressions in .NET — Microsoft Learn https://learn.microsoft.com/ro-ro/dotnet/standard/base-types/best-practices-regex
[7] Why you shouldn’t use slow regular expressions — DEV Community https://dev.to/leduc1901/why-you-shouldnt-use-slow-regular-expressions-2bnc
[8] What are the best indexing strategies for improving data ingestion speed in MongoDB? — https://minervadb.xyz/indexing-to-optimize-data-ingestion-in-mongodb/
[9] 24×7 MongoDB Consultative Support: Empowering Your Database Operations — https://minervadb.xyz/mongodb-support/
Перекладено з: How can I reduce backtracking in regex queries?