regex: присоединить новую строку к каждому предложению, используя vim - PullRequest
7 голосов
/ 18 октября 2010

Мне было интересно, как превратить абзац в пули в Vim.

до:

sentence1. sentence2.  sentence3.  sentence4.  sentence5.  sentence6. 
sentence7. 

после:

предложение1.

предложение2.

предложение3

предложение4.

предложение5.

Ответы [ 8 ]

11 голосов
/ 18 октября 2010

Поскольку все остальные ответы пока показывают, как это сделать на разных языках программирования, и вы пометили вопрос с помощью Vim, вот как это сделать в Vim:

:%s/\.\(\s\+\|$\)/.\r\r/g

Я использовал две кареткивозвращается в соответствии с форматом вывода, который вы показали в вопросе.Существует несколько альтернативных форм регулярных выражений, которые вы можете использовать:

" Using a look-behind
:%s/\.\@<=\( \|$\)/\r\r/g
" Using 'very magic' to reduce the number of backslashes
:%s/\v\.( |$)/.\r\r/g
" Slightly different formation: this will also break if there
" are no spaces after the full-stop (period).
:%s/\.\s*$\?/.\r\r/g

и, возможно, многие другие.

Это можно сделать без регулярного выражения:

:let s = getline('.')
:let lineparts = split(s, '\.\@<=\s*')
:call append('.', lineparts)
:delete

См .:

:help pattern.txt
:help change.txt
:help \@<=
:help :substitute
:help getline()
:help append()
:help split()
:help :d
1 голос
/ 18 октября 2010

Вы можете использовать регулярное выражение

/\.( |$)/g

Это будет соответствовать концу предложения, тогда вы можете добавить новые строки.

Или вы можете использовать некоторую функцию split с . (точка) и . (точка), а затем объединить с помощью новых строк.

1 голос
/ 18 октября 2010

Использование Perl:

perl -e "$_ = <>; s/\.\s*/.\n/g; print"

Более длинная, более читаемая версия:

my $input = 'foo. bar. baz.';
$input =~ s/
    \.      # A literal '.'
    \s*     # Followed by 0 or more space characters
    /.\n/gx;       # g for all occurences, x to allow comments and whitespace in regex
print $input;

Использование Python:

import re
input = 'foo. bar. baz.'
print re.sub(r'\.\s*', '.\n', input)
1 голос
/ 18 октября 2010

Просто замените все конец предложений /(?<=.) / точкой, за которой следуют два символа новой строки /.\n\n/.Синтаксис, конечно, будет зависеть от языка, который вы используете.

0 голосов
/ 21 сентября 2012

Я понял, как это сделать в RegExr

Строка поиска:

(\ - =? \ S +)

-

Заменить строку:

\ n \ n


Это сгенерированная информация для текущего регулярного выражения

RegExp:/(\-=?\s+)/g

шаблон: (\-=?\s+)

флаги: g

группы захвата: 1

группа 1: (\-=?\s+)

Это найдет каждое - в предложении ниже и заменит его двумя новыми строками

Предложение 1- Предложение 2- Предложение 3- Предложение 4- Предложение 5-

Конечный результат:

Предложение 1

Предложение 2

Предложение 3

Предложение 4

Приговор 5

0 голосов
/ 18 октября 2010

с использованием awk

$ awk '{$1=$1}1' OFS="\n" file
sentence1.
sentence2.
sentence3.
sentence4.
sentence5.
sentence6.
sentence7
0 голосов
/ 18 октября 2010

В PHP:


<?php
$input = "sentence. sentence. sentence.";
$output = preg_replace("/(.*?)\\.[\\s]+/", "$1\n", $input);
?&gt

Кроме того, регулярные выражения - взрыв, но не являются необходимыми для этой проблемы. Вы также можете попробовать:


&lt?php
$input = "sentence. sentence. sentence.";
$arr = explode('.', $input);
foreach ($arr as $k => $v) $arr[$k] = trim($v);
$output = implode("\n", $arr);
?&gt

0 голосов
/ 18 октября 2010

Пример использования Ruby:

ruby-1.9.2 > a = "sentence1. sentence2.  sentence3. and array.split(). the end."
 => "sentence1. sentence2. sentence3. and array.split(). the end." 

ruby-1.9.2 > puts a.gsub(/\.(\s+|$)/, ".\n\n")                                
sentence1.

sentence2.

sentence3.

and array.split().

the end.

Это похоже на то, что для каждого ., за которым следует (1 пробел или более или после конца строки), замените его просто . и двумя символами новой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...