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

193
28 июня 2018, 17:50

Может ли статический анализатор 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: Этот вопрос на английском.

Answer 1

Если регулярное выражение дает совпадение с позицией, началом текста и концом текста, то оно valid, потому что эти три возможных варианта совпадений присутствуют в любом тексте.
Позиция это:

Во всех остальных случаях всегда можно найти текст, который не даст совпадений на регулярном выражении.

Анализ регулярного выражения следует проводить следующим образом: сначала надо проверить совпадет ли регулярное выражение с пустой строкой. Если не совпадет, то оно invalid, если совпадет, то необходимо построить AST регулярного выражения, выделить всё, что описывает литералы и найти такой литерал, который НЕ указан в регулярном выражении.
То есть для [^abc] таким литералом будет a, b и c. Для [a-z] таким литералом будет любой литерал не входящий в этот диапазон.
Если такой литерал найти не удалось, то мы не смогли решить задачу и я бы предложил бросить попытки анализа и считать регулярное выражение invalid.
Если такой литерал найти удалось, то применяем регулярное выражение к тексту, состоящему из минимум двух таких литералов. Если совпадение есть, то регулярное выражение valid, если нет, то invalid.

READ ALSO
Слайдер калькулятор

Слайдер калькулятор

Нужно сделать калькулятор выгоды по простой формуле: Формула расчет прибыли: 2300 * количество заказов * 0,27

207
AJAX вернуть несколько массивов

AJAX вернуть несколько массивов

Можно ли при помощи AJAX вернуть сразу несколько массивов? Не нашёл решения, подскажите как можно решить такую задачу ? (или всё объединять в один,...

177
Как получить элементы из Shadow DOM?

Как получить элементы из Shadow DOM?

На странице истории Google Chrome, все ссылки хранятся в так называемом «Shadow DOM»:

170