Регулярное выражение, соответствующее действительным регулярным выражениям - PullRequest
33 голосов
/ 12 декабря 2008

Существует ли регулярное выражение, которое соответствует допустимым регулярным выражениям?

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

Ответы [ 7 ]

41 голосов
/ 16 июля 2010

Существует ли регулярное выражение, которое соответствует допустимым регулярным выражениям?

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

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

38 голосов
/ 13 декабря 2008

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

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

15 голосов
/ 12 декабря 2008

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

9 голосов
/ 12 декабря 2008

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

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

5 голосов
/ 12 декабря 2008

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

4 голосов
/ 27 января 2009

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

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

http://video.yahoo.com/watch/111596/1710658 при приблизительно -17,20.

0 голосов
/ 12 декабря 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...