#javascript #регулярные_выражения #code_style #статический_анализ #eslint
Может ли статический анализатор javascript-кода проверить, что регулярное выражение будет давать совпадение на любой строке? s.match(/\w*/)[0] // valid s.match(/\w+/)[0] // invalid s.match(/id(\d{7})/)[1] // invalid s.match(/id(\d{7})|$/)[1] // valid Есть может, то есть ли уже такой плагин для какого-либо анализатора? PS: Этот вопрос на английском.
Ответы
Ответ 1
Если регулярное выражение дает совпадение с позицией, началом текста и концом текста, то оно valid, потому что эти три возможных варианта совпадений присутствуют в любом тексте. Позиция это: Во всех остальных случаях всегда можно найти текст, который не даст совпадений на регулярном выражении. Анализ регулярного выражения следует проводить следующим образом: сначала надо проверить совпадет ли регулярное выражение с пустой строкой. Если не совпадет, то оно invalid, если совпадет, то необходимо построить AST регулярного выражения, выделить всё, что описывает литералы и найти такой литерал, который НЕ указан в регулярном выражении. То есть для [^abc] таким литералом будет a, b и c. Для [a-z] таким литералом будет любой литерал не входящий в этот диапазон. Если такой литерал найти не удалось, то мы не смогли решить задачу и я бы предложил бросить попытки анализа и считать регулярное выражение invalid. Если такой литерал найти удалось, то применяем регулярное выражение к тексту, состоящему из минимум двух таких литералов. Если совпадение есть, то регулярное выражение valid, если нет, то invalid.
Комментариев нет:
Отправить комментарий