Проблема в том, что вы потребляете свои символы или не буквенные символы при первом обращении к ним, поэтому вы не можете сопоставить все, что хотите.Решением было бы использование разных регулярных выражений для разных шаблонов и объединение результатов в конце, чтобы вы могли получить желаемый результат:
Это будет соответствовать всем символам, начинающимся с не символа, за которым следует один символ, но НЕсопровождаемый не символом
[^A-Z]+[A-Z](?![^A-Z])
Это будет соответствовать символу, заключенному в не символы, содержащие перекрывающиеся результаты:
(?=([^A-Z]+[A-Z][^A-Z]+))
Это будет соответствовать символу, за которым следует только один или несколько не символовесли ему не предшествует не символ:
(?<![^A-Z])[A-Z][^A-Z]+
И это будет соответствовать отдельным символам, которые не заключены в не символы
(?<![^A-Z])[A-Z](?![^A-Z])
Комбинируя результаты, вы получите исправить желаемый результат :
C,D,T, )T, )F, ((E), F((, R)
Также, если вы понимаете мелкие детали, вы можете объединить это в одно регулярное выражение:
#!/usr/local/bin/perl
use strict;
my $subject = "0C0CC(R)CC(L)C0";
while ($subject =~ m/(?=([^A-Z]+[A-Z][^A-Z]+))|(?=((?<![^A-Z])[A-Z][^A-Z]+))|(?=((?<![^A-Z])[A-Z](?![^A-Z])))|(?=([^A-Z]+[A-Z](?![^A-Z])))/g) {
# matched text = $1, $2, $3, $4
print $1, " " if defined $1;
print $2, " " if defined $2;
print $3, " " if defined $3;
print $4, " " if defined $4;
}
Вывод:
0C0 0C C( (R) )C C( (L) )C0