Это утверждение:
Язык (сбалансированный)
выражения в скобках не
регулярный, то есть вы не можете написать
регулярные выражения, соответствующие этим
вид струн.
верно только для классических регулярных выражений в патологически формальном смысле. Это не применимо к практическим схемам, которые многие из нас используют ежедневно.
Например, используя третью строку из исходного списка допустимых входных данных, этот код Perl:
my $str = "((char)((x+y)&1))";
my $w = length length $str ;
my $rx = qr{ (?<PAREN>
\(
(?:
[^()] +
|
(?&PAREN)
) *
\)
)
}x;
while ($str =~ /(?=$rx)/g) {
printf "Matched from %*d to %*d: %s%s\n" =>
$w => pos($str),
$w => pos($str) + length($+{PAREN})-1,
" " x pos($str) => $+{PAREN};
}
довольно легко выдает следующий вывод:
Matched from 0 to 16: ((char)((x+y)&1))
Matched from 1 to 6: (char)
Matched from 7 to 15: ((x+y)&1)
Matched from 8 to 12: (x+y)
По исходному набору исходных данных я не могу понять, что делает один действительным, а другой - недействительным. Тем не менее, я уверен, что некоторые разработки кода, который я дал выше, будут работать отлично.
Однако, вам придется написать его на Perl, так как шаблоны Java просто недостаточно мощны. ☹