LINUX.ORG.RU

История изменений

Исправление a--, (текущая версия) :

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

perl -we 'print $+{foo} if "aaa" =~ /(?<foo>a*)/'

произвольный код в регексах в perl есть точно, в других от РНР до С++ — возможно что тоже есть, но я не юзаю в них мощные регексы

в перле так же есть возможность делать динамически-локальные переменные внутри регексов, чтобы при бэктрекинге они затирались; но если надо, то можно сохранять их в нелокальные; в red так можно?

твой byte может определяться через себя же (рекурсивно)?

дальше пересказ твоего кода с простейшим подсчетом

#!/usr/bin/perl -w

my $count = 0;

my $four=qr/(?:[01234](?{ ++$count }))/;
my $half=qr/[012345]/;
my $non_zero=qr/[123456789]/;
my $digit=qr/(?:$non_zero|0)/;
my $dot=qr/[.]/;

my $byte=qr/
      2         5      $half
    | 2         $four  $digit
    | 1         $digit $digit
    | $non_zero $digit
    | $digit
/x;

my $ipv4 = qr/(?{ $count=0 })$byte $dot $byte $dot $byte $dot $byte/x;

print "four matched $count times\n" if "222.238.10.1" =~ $ipv4;
print "four matched $count times\n" if "192.238.10.1" =~ $ipv4;
print "four matched $count times\n" if "192.188.10.1" =~ $ipv4;

Исходная версия a--, :

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

произвольный код в регексах в perl есть точно, в других от РНР до С++ — возможно что тоже есть, но я не юзаю в них мощные регексы

в перле так же есть возможность делать динамически-локальные переменные внутри регксов, чтобы при бэктрекинге они затирались; но если надо, то можно сохранять их в нелокальные; в red так можно?

твой byte может определяться через себя же (рекурсивно)?

дальше пересказ твоего кода с простейшим подсчетом

#!/usr/bin/perl -w

my $count = 0;

my $four=qr/(?:[01234](?{ ++$count }))/;
my $half=qr/[012345]/;
my $non_zero=qr/[123456789]/;
my $digit=qr/(?:$non_zero|0)/;
my $dot=qr/[.]/;

my $byte=qr/
      25 $half
    | 2  $four  $digit
    | 1  $digit $digit
    | $non_zero $digit
    | $digit
/x;

my $ipv4 = qr/(?{ $count=0 })$byte $dot $byte $dot $byte $dot $byte/x;

print "four matched $count times\n" if "222.238.10.1" =~ $ipv4;
print "four matched $count times\n" if "192.238.10.1" =~ $ipv4;
print "four matched $count times\n" if "192.188.10.1" =~ $ipv4;