История изменений
Исправление 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;