Хотелось бы, чтобы у Perl был флаг отрицания регулярного выражения! т.е. вернуть все символы, которые НЕ соответствуют / регулярное выражение /
То, что вы ищете, действительно является дополнением захвата регулярных выражений:
m/(.)(\1)+/
Я перепробовал все предложения на этой странице со списком данных Брайана (результат в списке его программ). Ни одна работа не полностью.
Регулярное выражение:
(?:^|(.)(?!\1))(.)(?!\2)
не соответствует началу 'f' в строках 2 и 3. Брайана не соответствует 'f' в начале строк 2 и 3 или любому из синглетонов в конце строки 5.
Регулярное выражение:
$str=~/^(([a-z])\g{-1}+)*(?<c>[a-z])/i;
$char = $+{c};
работает.
Единственное найденное мной регулярное выражение - это простое:
#!/usr/bin/perl
while( <DATA> ) {
chomp;
print "BEFORE: $_\n";
s/(.)(\1)+//g;
print "AFTER: $_\n";
print "charater: " . substr($_,0,1) . "\n\n";
}
__END__
aabbccddeef
faabbccddeef
faabbccddeefax
xfaabbccddeefx
xabcdefghai
cccdddeeea12345
1234a5678a23
aabbcdecc
abcdefg
aabbccddeef
cccdddeeea12345
Это работает в простом случае «дать первый символ». ((edit: reread: извините, я сейчас прочитал, что очевидное удаление двойников было не тем, что вы искали ...))
Рад слышать, если есть лучшее решение.