Вместо того, чтобы создавать магическое регулярное выражение для выполнения всей работы, почему бы не разделить строку на фразы, оперировать ими и вернуть их.Это следует той же логике, которую вы только что объяснили.
Это тогда чище, более читабельно (особенно если вы добавляете комментарии) и надежнее.Конечно, вам нужно будет приспособиться к вашим потребностям: например, вы можете захотеть разделить отдельные части /
на пары ключ / значение (имеет ли значение порядок? Если не создать хэш-ссылку);возможно, вам не нужно разделять на /
, если вам никогда не нужно изменять метку;и т. д.
Редактировать по комментариям: буквально w
предшествует #
, сохраняет его, удаляет фразу, а затем прикрепляет w
к следующей фразе.Если это то, что вам нужно, то имейте это.Конечно, я уверен, что есть крайние случаи, на которые стоит обратить внимание, поэтому сначала сделайте резервную копию и протестируйте!
#!/usr/bin/env perl
use strict;
use warnings;
while( my $line = <DATA> ) {
#separate phrases, then split phases into whitespace separated pieces
my @phrases = map { [split /[\s]/] } ($line =~ /\[([^]]+)\]/g);
my $holder; # holder for 'w' (not really needed if always 'w')
foreach my $p (@phrases) { # for each phrase
if ($p->[1] =~ /(w)#/) { # if the second part has 'w#'
$holder = $1; # keep the 'w' in holder
$p = undef; #empty to mark for cleaning later
next; #move to next phrase
}
if ($holder) { #if the holder is not empty
$p->[1] = $holder . $p->[1]; # add the contents of the holder to the second part of this phrase
$holder = undef; # and then empty the holder
}
}
#remove emptied phrases
@phrases = grep { $_ } @phrases;
#reconstitute the line
print join( ' ', map { '[' . join(' ', @$_) . ']' } @phrases), "\n";
}
__DATA__
[S w#/CC] [VP mSf/VBD_MS3]
Опять же, может показаться удивительным, что вы можете сделать с одним регулярным выражением, но что произойдет, если ваш боссприходит и говорит: «Вы знаете, что то, что вы написали для X, прекрасно работает, но теперь нужно сделать и Y».Вот почему мне нравится вести отдельную логику для каждого логического шага.