Сплит версия. Я вроде как разделяю для этого, потому что это неинвазивно, сохраняя оригинальный формат, а также, регулярные выражения становятся ... сложными. Хотя, конечно, вам нужно регулярное выражение, чтобы урезать его.
Тебе все еще нужно проработать интервал. Не просто предсказать, появится ли дополнительное пространство в передней части или в конце, и удаление всех двойных пробелов не сохранит исходный формат. Это решение удаляет единственное пространство перед открывающимися скобками и ничего больше. Работает в большинстве случаев, предполагая, что ввод имеет правильную пунктуацию для начала.
use warnings;
use strict;
while (<DATA>) {
my @parts = split /\(/;
print de_paren(@parts);
}
sub de_paren {
my $return = shift;
my @parts = @_;
while (my $word = shift @parts) {
next unless $word =~ /\)/;
$word =~ s/^.*?\)// while ($word =~ /\)/);
$return =~ s/ $//;
$return .= $word;
}
return $return;
}
__DATA__
A (doubly (no, (triply!) nested)) string
This is a (extra stuff) string.
(Preliminary remark) string
String (with end remark) String (with end remark)
A string (remark before punctuation)!
A (doubly (nested)) string
Вывод:
A string
This is a string.
string
String String
A string!
A string ->