Regexp, который соответствует действительным регулярным выражениям

Есть ли регулярное выражение, которое соответствует действительным регулярным выражениям?

(Я знаю, что есть несколько вариантов регулярных выражений. Можно было бы сделать.)

Ответ 1

Если вы просто хотите проверить правильность регулярного выражения, просто попробуйте скомпилировать его с любым языком программирования или библиотекой регулярных выражений, с которой вы работаете.

Разбор регулярных выражений далеко не тривиальен. Как автор RegexBuddy, я был вокруг этого блока несколько раз. Если вы действительно хотите это сделать, используйте регулярное выражение для токенизации ввода и оставьте логику синтаксического анализа процедурным кодом. То есть ваше регулярное выражение будет соответствовать одному токену регулярного выражения (^, $, \w, (, ) и т.д.) За раз, и ваш процедурный код будет проверять, находятся ли они в правильный порядок.

Ответ 2

Есть ли регулярное выражение, которое соответствует действительным регулярным выражениям?

По определению это довольно просто: Нет.

Язык всех регулярных выражений - это no регулярный язык (просто посмотрите на вложенные круглые скобки), и поэтому не может быть регулярного выражения для его анализа.

Ответ 3

К сожалению, большинство недопустимых регулярных выражений недопустимы из-за ошибок вложенности скобок. Это точно тип строк, которые регулярные выражения не могут совпадать. (Хорошо, некоторые причудливые системы регулярных выражений имеют рекурсионные расширения, но это редко)

Ответ 4

Как уже говорилось, вы не можете описывать регулярные выражения с регулярным выражением из-за их рекурсивного характера. Для этого вам понадобится контекстная свободная грамматика.

Но каково было бы иметь такое регулярное выражение? Если вы просто хотите проверить правильность регулярного выражения, вы можете просто попробовать его использовать (Pattern.compile(regexp) в Java), и если он кричит, это неверно.

Ответ 5

Вам, вероятно, нужен парсер, а не регулярное выражение. Регулы являются мощными инструментами, но не являются инструментами синтаксического анализа. Например, они плохо подходят для вложенных грамматик.

Ответ 6

От Дугласа Крокфорда Видео на языке программирования JavaScript 4 (из 4):

/\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/[gim]*/

http://video.yahoo.com/watch/111596/1710658 примерно на -17.20.

Ответ 7

В зависимости от вашей цели я бы сказал, возможно, возможно.

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

Если вам просто нужно знать, не существует ли regexp, существует другой способ. В зависимости от языка, который вы используете, вы можете попробовать/поймать

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