Применить регулярное выражение заменить только на указанный кусок - PullRequest
2 голосов
/ 15 июня 2011

Мне нужно применить фильтрацию регулярных выражений, чтобы воздействовать только на фрагменты текста в кавычках, и я сбит с толку.

 $in = 'ab  c "d e  f" g   h "i    j" k l';
 #...?
 $inquotes =~ s/\s+/_/g; #arbitrary regexp working only on the pieces inside quote marks
 #...?
 $out = 'ab  c "d_e_f" g   h "i_j" k l';

(конечный эффект может удалить / удалить кавычки, если это облегчает задачу, 'ab c d_e_f g ...)

Ответы [ 3 ]

3 голосов
/ 15 июня 2011

Вы могли бы придумать какой-нибудь милый трюк, похожий на шум линии.

Или вы могли бы сделать его простым и читабельным, просто используя split и join.Используя знак кавычки в качестве разделителя полей, оперируйте с любым другим полем:

my @pieces = split /\"/, $in, -1;

foreach my $i (0 ... $#pieces) {
    next unless $i % 2;
    $pieces[$i] =~ s/\s+/_/g;
}

my $out = join '"', @pieces;
1 голос
/ 15 июня 2011

Если вы хотите использовать только регулярное выражение, должно работать следующее:

my $in = q(ab  c "d e  f" g   h "i    j" k l);

$in =~ s{"(.+?)"}{$1 =~ s/\s+/_/gr}eg;
print "$in\n";

(Вы сказали, что "s могут быть отброшены :))

HTH,Пол

1 голос
/ 15 июня 2011

Что-то вроде

s/\"([\a\w]*)\"/

должно соответствовать указанным фрагментам. Мой синтаксис регулярных выражений в Perl немного ржавый, но разве не стоит просто размещать литералы кавычек вокруг того, что вы захватываете, для выполнения работы? Затем у вас есть строка в кавычках d e f внутри первой группы захвата, так что вы можете делать с ней все, что захотите ... Какую «произвольную операцию» вы пытаетесь выполнить со строками в кавычках?

Хм.

Возможно, лучше сопоставить строки в кавычках, а затем передать их другому регулярному выражению, а не делать все это в одном.

...