Muranx
@Muranx
кто понял this тот в цирке не смеётся

Как проверять regexp?

Здравствуйте!

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

Когда мне надо написать regexp я захожу на regex101 и просто вбиваю возможные варианты написания того, что мне нужно проверить на валидность, и потом собственно пишу регулярку , как например вот эту :

function\s*([a-z0-9_]*)\s*(?:\(\s*\)|\(\s*([a-z_0-9])*\s*\)|\(\s*([a-z_0-9, ]*)\s*\))

function man(){}

function(){}

function V_af(){}

function man (){}

function man (b){}

function man ( a){}

function man( a,b,c){}

function man( a, b, c ){}

function man( aads,bsadf,casdf){}

function man( aads , bsadf , casdf ){}

function (bsadf , casdf ){}

Но . . . я же могу рассмотреть не все варианты , отсуда собственно может появиться проблемы на стадии внедрения уже непосредственно допустим в код, НО опять же, если код из 10 строчек, его не проблема проверить, а если код состоит из 10к строк, то там ошибка в регулярке может стать причиной для тяжело уловимых багов (ну на сколько мне кажется)

В общем вопрос в том, на сколько такой подход к составлению регэкспов правилен? Существуют ли методики написания, т.к. я банальным образом доходя до "развилок" (так я называю варианты например написания аргументов) просто перечисляют их через |!? В общем было бы не плохо услышать ответ от тех, кто имеет опыт в их написании, и я сейчас не про тех, кто просто умеет выделить хекс код цвета, а про тех, кто их применяет в своём коде, и из своего опыта может дать пару полезных советов по использованию регулярок, т.к. есть некоторые регулярки, длиной в 20 строк, но при этом в интернете всё пестрит примерами вроде \w@\w.com
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
Вы делаете ошибку, тестируя только правильные варианты. Например, ваша регулярка посчитает правильными: function (, ,) или function(a b). И вы зря не обращаете внимания на примеры в интернете: \w короче и удобнее, чем [a-z0-9_]. Главное же - просто опыт.

Например, зачем повторять \(...\) в каждой группе, если это можно вынести за группировку? И зачем выделять отсутствие параметров в отдельный случай?

Я бы записал в таком виде:
\bfunction\s*(\w+)?\s*\(\s*(\w+(?:\s*,\s*\w+)*)?\s*\)

Но сама по себе идея анализировать язык программирования регулярными выражениями не является удачной:
регулярные выражения реализуют только регулярные грамматики (грамматики типа 3), тогда как для описания синтаксиса языка программирования требуется контекстно-свободная грамматика (грамматика типа 2). Разница между ними в том, что контекстно-свободная грамматика позволяет задавать рекурсивные правила (function внутри function) с неограниченной глубиной рекурсии.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dimoff66
Кратко о себе: Я есть
Когда мне надо написать regexp я захожу на regex101


Когда мне надо написать regexp я читаю справочник по регулярным выражениям, ну например такой вот упрощенный и составляю регулярное выражение, а ПОТОМ УЖЕ могу пойти на regex101 или другую песочницу, дабы быстро проверить его на работоспособность для различных возможных строк.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы