2013-10-04 4 views
1

Я пытаюсь написать регулярное выражение для удаления пустых строк в строке (и не заботится о пробельных между пунктами списка), например: baz foo, "","", bar, "" становится baz foo, barPerl регулярное выражение для удаления пустых строк

До сих пор я стараюсь

$newLine =~ s/""\s*?,//g; 
$newLine =~ s/,\s*?""//g; 

но данный baz "", foo, "" он возвращается baz foo, "", но я хочу, чтобы вернуть baz foo.

Может ли кто-нибудь объяснить, что пойдет не так/как я могу это исправить?

Благодаря

ответ

1

Ваш код работает для меня:

$string = 'baz "", foo, ""'; 
$string =~ s/""\s*?,//g; 
$string =~ s/,\s*?""//g; 
print "$string\n"; 

Возвращает

baz foo 

для меня.

Редактировать: Как указано в комментарии ниже, он не будет работать для строки baz "", "". Это потому, что первое регулярное выражение потребляет , непосредственно перед вторым "", в результате чего второе регулярное выражение не совпадает.

Альтернативой для регулярных выражений было бы использовать map.

$string = 'baz "", "", foo'; 
$string = join(" ", map { $_ =~ s/\s*""\s*//g; $_; } (split(/\s*,\s*/, $string))); 

Это установит $string в baz foo

+0

Ну, это было для меня, используя этот код он представил. Он вернул именно то, что он описывает как необходимый вывод из ввода 'baz '", foo, "" '. – Vince

+0

А теперь я это вижу. Хорошо, я добавлю это к моему ответу. – Vince

1

легче разбить строку, удалить элементы, которые не содержат ничего, кроме "" (и, возможно, окружающих пространств) и присоединиться к их обратно.

Следующая может работать для вас:

@foo = grep { !/\s?""\s?/ } split /,/, $newLine; 
$newLine = join(',', @foo); 

Пример:

$ cat mmm 
$newLine = 'baz foo, "","", bar, ""'; 
@foo = grep { !/\s?""\s?/ } split /,/, $newLine; 
$newLine = join(',', @foo); 
print $newLine . "\n"; 
$ perl mmm 
baz foo, bar 
Смежные вопросы