Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Гарантировать отсутствие null после match

#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.

Комментариев нет:

Отправить комментарий