Как я могу проверить, является ли шаблон регулярных выражений действительным в Perl? - PullRequest
4 голосов
/ 11 июля 2009

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

Если для этого нет встроенной функции, как мне это сделать самостоятельно? Мне вообще нужно?

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

РЕДАКТИРОВАТЬ: я должен отметить, что я планирую генерировать эти шаблоны на лету на основе пользовательского ввода - вот почему я хотел бы проверить их, чтобы убедиться, что они действительно будут работать.

Ответы [ 3 ]

20 голосов
/ 11 июля 2009

Я не эксперт по Perl, но возможно это может помочь:

#!/usr/bin/perl

my $pattern = "["; # <-insert your pattern here
my $regex = eval { qr/$pattern/ };
die "invalid regex: $@" if $@;

, который возвращает это:

invalid regex: Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE / at test.pl line 4.

По второму вопросу вы всегда можете проверить огромное количество работ на CPAN .

2 голосов
/ 11 июля 2009

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

Но это не защитит вас от логических или семантических ошибок. То есть ваше регулярное выражение может быть допустимым Perl, но делать ужасные вещи - или вообще ничего не делать. Возможно, вам нужно что-то вроде YAPE :: Regex :: Explain , которое даст объяснение вашего регулярного выражения.

1 голос
/ 10 июня 2013

Другой модуль cpan, который вы можете использовать: Regexp :: Parser . Из документации:

my $parser = Regexp::Parser->new;
if (! $parser->regex($rx)) {
  my $errmsg = $parser->errmsg;
  my $errnum = $parser->errnum;
  # ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...