Сокращение RegEx для Perl - PullRequest
       2

Сокращение RegEx для Perl

1 голос
/ 28 января 2011

Я создал регулярное выражение в Perl длиной около 95 символов, я хочу сократить его до 78 символов, но не могу найти подходящий метод. Любой совет приветствуется, регулярное выражение похоже на код ниже, в идеале есть что-то похожее на \ in C.

my ($foo, $bar, $etc) = $input_line =~ 
/^\d+: ....  (\X+)\(\X(\d+.\d+|\d+)\/\X(\d+.\d+|\d+) (\X+)\)$/

Ответы [ 3 ]

2 голосов
/ 28 января 2011

Существует способ указать регулярному выражению пропустить встроенные пробелы и комментарии, поэтому не только вы можете разбить его на несколько строк, но и прокомментировать, отформатировать в разделы и т. Д. Я думаю, что это «х», но я не сейчас у вас нет под рукой документации, поэтому посмотрите ее на странице руководства.

Так что вы изменили бы его на что-то вроде:

my ($foo, $bar, $etc) = $input_line =~ /
        ^\d+: ....
        (\X+)\(
            \X(\d+.\d+|\d+) # numerator
            \/\X(\d+.\d+|\d+) # denominator
            \ (\X+)\)$/x # mind the escaped space!

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

my $num_re = qr/(\X+)\(\X(\d+.\d+|\d+)\/\X(\d+.\d+|\d+)/;
my ($foo, $bar, $etc) = $input_line =~ /^\d+: ....  $num_re (\X+)\)$/;

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

0 голосов
/ 28 января 2011

Одна вещь, которую я вижу в регулярном выражении, это точка в '\ d +. \ D +'.

Вы знаете это. ' в регулярном выражении соответствует ЛЮБОМУ символу, а не только фактическому символу точки.

Если вы хотите указать только фактический символ периода, вам придется использовать '\.' вместо этого.

Другое дело, что вы можете заменить '\ d +. \ D + | \ d +' на '\ d +.? \ D +'

[EDIT] Еще одна вещь, если вы используете интерполированное регулярное выражение более одного раза и не меняете его между использованиями (скажем, в цикле), вы должны использовать параметр / o, чтобы Perl компилировал все регулярное выражение, чтобы нужно компилировать каждый раз.

0 голосов
/ 28 января 2011

Perl интерполирует регулярные выражения, так что вы можете сделать что-то вроде этого

my $input_line = '123: ....  X(X1.1/X5 XXX)';

 my $dOrI = '(\d+.\d+|\d+)';
 my ($foo, $bar, $etc) = $input_line =~ 
 /^\d+: ....  (\X+)\(\X$dOrI\/\X$dOrI (\X+)\)$/;

print "$foo, $bar, $etc";

Выход -

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