Javascript регулярное выражение зависает (с использованием v8)

Javascript регулярное выражение зависает (с использованием v8)

Это катастрофически возвращает назад к длинным последовательностям пробелов, которые появляются после последнего закрывающего </tag:main> . Рассмотрим случай, когда строка темы заканчивается 100 пробелами. Сначала это соответствует им всем с . слева от чередования. Это терпит неудачу, потому что нет закрывающего тега, поэтому он пытается сопоставить последний символ с s . Это тоже не удается, поэтому он пытается сопоставить второй-последний пробел как s и последний пробел как . , Это терпит неудачу (все еще без закрывающего тега), поэтому он пробует последний пробел как s . Если это не удается, он соответствует пробелу от третьего до последнего в виде s и пробует все 4 способа сопоставить последние два пробела. Когда это терпит неудачу, он пробует четвертый до последнего пробел как s и все 8 путей на последних 3 пробелах. Затем 16, 32 и т. Д. Вселенная заканчивается, пока не достигнет 100-го до последнего пространства.

Разные виртуальные машины по-разному реагируют на совпадения регулярных выражений, которые происходят вечно из-за катастрофического возврата. Некоторые просто сообщат «нет совпадения». В V8 это похоже на написание любого другого бесконечного или почти бесконечного цикла.

Использование non-greedy * будет делать то, что вы хотите (вы хотите остановиться на первом </tag:main> , а не на последнем), но все равно будет выполнять катастрофический возврат для длинных строк пробелов, в которых отсутствует закрывающая последовательность.

Убедившись, что одни и те же символы во внутренней скобке не могут совпадать с обеими сторонами чередования, уменьшит проблему от экспоненциального до линейного по длине строки. Используйте класс символов вместо чередования или поместите n справа от чередования. n не пересекается с . поэтому, если вы нажмете длинную последовательность пробелов, механизм регулярных выражений не пробует все комбинации слева направо, налево и т. д. до завершения.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector