Обсуждение статьи тематического каталога: Проверка сбалансированности скобок на Perl (regex perl)Ссылка на текст статьи: http://www.opennet.me/base/dev/nested_regex.txt.html
Вариант проверки сбалансированности и правильной вложенности набора круглых, квадратных и фигурных скобок:#!/usr/bin/perl
use strict;
my $cnt; my $s; my $stop;
$_ = shift;
print "$_ is OK" if
(m/^
(?: (?{ $cnt = 0; $stop = 0; $s = ""; })
(?> (?(?{ $stop })\G(?!))
([\(\[\{]) (?{ ++$cnt; $s .= $1; print $s . "\n"; })
|\) (?(?{ $cnt and (chop($s) eq "(") }) (?{ --$cnt; }) | (?{ ++$stop; })(?!))
|\] (?(?{ $cnt and (chop($s) eq "[") }) (?{ --$cnt; }) | (?{ ++$stop; })(?!))
|\} (?(?{ $cnt and (chop($s) eq "\{") }) (?{ --$cnt; }) | (?{ ++$stop; })(?!))
|(?> [^()] )
)*
)
(?(?{ $cnt }) (?!) )
$/x);
упс... упустил кое-что...#!/usr/bin/perl
use strict;
my $cnt; my $s; my $stop;
$_ = shift;
print "$_ is OK\n" if
(m/^
(?: (?{ $cnt = 0; $stop = 0; $s = ""; })
(?> (?(?{ $stop })\G(?!))
([\(\[\{]) (?{ ++$cnt; $s .= $1; })
|\) (?(?{ $cnt and (chop($s) eq "(") }) (?{ --$cnt; }) | (?{ ++$stop; })(?!))
|\] (?(?{ $cnt and (chop($s) eq "[") }) (?{ --$cnt; }) | (?{ ++$stop; })(?!))
|\} (?(?{ $cnt and (chop($s) eq "\{") }) (?{ --$cnt; }) | (?{ ++$stop; })(?!))
|(?> [^()\[\]\{\}] )
)*
)
(?(?{ $cnt }) (?!) )
$/x);