2015-06-22 2 views
1

Я пытаюсь разработать регулярное выражение, которое заменит беспорядочные окончания предложений на более чистые.Perl Regex - Заменить окончание предложений на период, одно пробел, заглавную букву

Например, поворачиваясь:

the quick.brown fox. jumped over! the slow. dog 

В:

The quick. Brown fox. Jumped over. The slow. Dog 

Вот что я до сих пор:

my $test = ucfirst('the quick.brown fox. jumped over! the slow. dog'); 
$test =~ s/([\.\?!]\s*[a-z])/\U$1/mg; 
print $test; 

Результат:

The quick.Brown fox. Jumped over! The slow. Dog 

Мне не повезло выяснить, как заставить период и одиночные пробелы.

Любая помощь приветствуется, спасибо!

+0

Я не знаю perl, но, возможно, '([.?!]) \ S' заменить' $ 1'. – chris85

+0

Вы уверены, что первая буква, следующая за '.,?,!', Будет более строчной? Как насчет этого, например: 'quick.Brown fox.' – David

ответ

1

Я думаю, что это будет делать то, что вы хотите:

my $test = ucfirst('the quick.brown fox. jumped over! the slow. dog'); 
$test =~ s/[.?!]\s*([a-z]?)/. \U$1/img; 
say $test; 

Как вы можете видеть, я переместил отверстие ( так что единственное, что захваченный было письмо, которое вы хотите преобразовать в верхний регистр. Все части матча с левой стороны будут удалены/заменены, скобки захвата (...) + $1 позволяют переносить часть этого на другую сторону.

Обратите внимание, что вам не требуется обратная косая черта в [...].

@ Редакция Borodin добавила ? после [a-z], что делает письмо необязательным. Это позволяет нормализовать пунктуацию и следующие пробелы, даже если следующая вещь не является буквой, или если это конец строки.

+0

Это отлично поработало, спасибо за объяснение. Мне пришлось исключить из этого «.com» и «.net» из этого для моих целей, закончив с добавлением отрицательного взгляда в начало: '$ text = ~ s/(?!. Com | .net) [ .?] \ с * ([AZ]?) /. \ U $ 1/IMG; ' –

Смежные вопросы