Регулярное выражение, соответствующее регулярным выражениям - PullRequest
3 голосов
/ 15 января 2010

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

Ответы [ 7 ]

17 голосов
/ 15 января 2010

Регулярные выражения не являются регулярным языком и поэтому не могут быть описаны регулярным выражением!

Обновление : более полезный практический ответ

Вы не можете обнаружить допустимые регулярные выражения, используя любое регулярное выражение. Чтобы определить его достоверность, вам нужно просто проанализировать строку с помощью библиотеки регулярных выражений, и она не будет работать, если это недопустимое регулярное выражение. Например, в Java это будет что-то вроде:

boolean isValidRegexp(String s) {
  try {
    Pattern.compile(s);
    return true;
  } catch (Exception e) {
    return false;
  }
}

Эта техника должна работать практически на любом языке.

8 голосов
/ 15 января 2010

Вы все не правы! В моих секретных лабораториях мои злые ученые обнаружили регулярное выражение, которое может соответствовать любому регулярному выражению:

.*

Он даже будет соответствовать нулевому выражению. Давайте посмотрим, как вы пытаетесь сопоставить с !

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

2 голосов
/ 15 января 2010

Невозможно использовать стандартные регулярные выражения.

Регулярные выражения могут быть вложены бесконечно (например, /(a(b(c(d))))/), что невозможно сопоставить с помощью стандартного регулярного выражения.

1 голос
/ 02 декабря 2010

Согласно Крокфорду это регулярное выражение, которое соответствует регулярному выражению (по крайней мере, в JavaScript)

/\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/[gim]*/
0 голосов
/ 15 января 2010

Вот и мы:

m{/([^\\/]++|\\.)/}

Должно соответствовать регулярному выражению, ограниченному //.

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

0 голосов
/ 15 января 2010

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

0 голосов
/ 15 января 2010

Да.Пример: это регулярное выражение ^[a-z][+*]$ будет соответствовать этому регулярному выражению z+, этому a*, этому c+ и т. Д.

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