URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 63474
[ Назад ]

Исходное сообщение
"Тематический каталог: Проверка сбалансированности скобок на ..."

Отправлено auto_topic , 02-Фев-10 10:15 
Обсуждение статьи тематического каталога: Проверка сбалансированности скобок на Perl (regex perl)

Ссылка на текст статьи: http://www.opennet.me/base/dev/nested_regex.txt.html


Содержание

Сообщения в этом обсуждении
"Проверка сбалансированности скобок на Perl (regex perl)"
Отправлено Denis , 02-Фев-10 10:15 
Вариант проверки сбалансированности и правильной вложенности набора круглых, квадратных и фигурных скобок:

#!/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);


"Проверка сбалансированности скобок на Perl (regex perl)"
Отправлено Denis , 02-Фев-10 10:22 
упс... упустил кое-что...

#!/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);