Что не так с этой заменой? - PullRequest
2 голосов
/ 02 июня 2010
#!/usr/bin/perl

use strict;
use warnings;

my $s = "sad day
 Good day
 May be Bad Day 
 ";

$s =~ s/\w+ \w+/_/gm;

print $s;

Я пытаюсь заменить все пробелы между словами на _, но это не работает. Что с этим не так?

Ответы [ 3 ]

5 голосов
/ 02 июня 2010

Подстановка заменяет целое слово (\w+), затем пробел, а затем другое слово подчеркиванием.

На самом деле нет необходимости заменять (или фиксировать, что важно) эти слова

$a=~s/\b +\b/_/gm;

заменит разрыв слова (\b, переход нулевой ширины между словом и не словом), за которым следует один или несколько пробелов, за которыми следует другой разрыв слова, с подчеркиванием. Использование \b гарантирует, что вы не замените пробел после или до новой строки.

3 голосов
/ 02 июня 2010

Эта замена шаблона, вероятно, является наиболее эффективным решением:

$a =~ s/\b \b/_/g;
2 голосов
/ 02 июня 2010

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

$s =~ s/(?<=\w) (?=\w+)/_/g
  • По сути, это то же самое, что и решения, включающие анкер границы слов нулевой ширины, \b.

  • Обратите внимание, что регулярные выражения предварительного просмотра могут соответствовать регулярным выражениям любой длины символа, но регулярные выражения предварительного просмотра должны быть фиксированной длины (поэтому (?<=\w+) не может быть сделано). 1015 *

...