для разбора строки, содержащей сбалансированное количество открывающих и закрывающих скобок указанного типа, например таких как fgh(dfg)fgf, sdfg(sdfg(asdf))dsfg, но не sgsdgf(()dgsdfg
sub get_matching_parens
{
my $expr = shift;
my @matching_parens = ();
my @stk = ();
for (my $i = 0; $i < length($expr); $i++)
{
if (substr($expr, $i, 1) eq '(')
{
push(@stk, $i);
next;
}
if (substr($expr, $i, 1) eq ')')
{
if (scalar(@stk) == 0)
{
return undef;
}
$matching_parens[pop(@stk)] = $i;
next;
}
}
if (scalar(@stk) > 0)
{
return undef;
}
return \@matching_parens;
}
это на перле. Если выражение не валидно -- вернет undef. Иначе -- массив -- если в позиции i стоит открывающая скобка, то в массиве в этой же позиции стоит индекс закрывающей скобки.
Мне нужно не это. Мне нужно иметь возможность разбирать строку, содержащее описанное выражение, как это делает обычные регеспы. То есть я задаю шаблон, содержащий подшаблон выражения и другие подшаблоны, для строки, и происходит разбор строки с запоминанием значений подшаблонов и выдачей чего-то вроде v1=substr1, v2=substr2..., где v1 - подшаблон, а substr[i] - значение этого подшаблона.