2014-09-10 5 views
0

Я просмотрел this question,, и я попытался изменить ответ, но я все еще в тупике.Гибкий подсчет абзацев

Мне нужно сосчитать абзацы в строке. Тем не менее, абзацы могут быть разделены любым числом символов новой строки (1-я строка новой строки), начинаться с или без вкладок (вкладки 0-n), а пустые строки, содержащие только пустые символы, не должны учитываться (это часть это отключает меня).

Пример документа:

First paragraph. 
Second paragraph. 
<tab>The third. 
<tab> <tab> <tab> 
<tab>The fourth. 

The fifth. 

Любая помощь будет высоко оценили.

+0

Итак, вы ищете как минимум 1 пустую строку между абзацами? – sln

ответ

1

можно разделить на вкладке и новой строки, и удалить пустые строки

text.Split(new string[] { Environment.NewLine, "\t", "\n" }, StringSplitOptions.RemoveEmptyEntries) 
    .Where(x => x.Trim() != "") 

см демо: https://dotnetfiddle.net/Y79QjG

+0

Это прекрасно работает! Он очень быстро справился со всем текстом «Война и мир». – Griven

+0

@Griven: вы проверяете все линии? –

1

С разделенного методом и этот шаблон:

string[] result = Regex.Split(input, @"(?<=\.)[^\S\n]*\n\s*"); 

online demo

модели детали:

(?<=\.)  # lookbehind: preceded by a literal dot (you can add ! and ? too) 
[^\S\n]* # all whitespace characters except the linefeed (zero or more) 
\n   # linefeed character 
\s*   # all whitespace characters (zero or more) 

Количество пунктов является количество элементов в result[] раз у вас есть удалил последний элемент, если он пуст. Тем не менее, вы можете избежать проблемы пустого элемента с помощью:

string[] result = Regex.Split(input, @"(?<=\.)[^\S\n]*\n(?>\s*)(?!\z)"); 

online demo

или

string[] result = Regex.Split(input, @"(?<=\.)(?!\s*\z)[^\S\n]*\n\s*"); 

online demo

(Обратите внимание, что если вы хотите, чтобы извлечь каждый абзац, вам необходимо обрезать пробелы справа от последнего элемента)

+0

Это меня довольно близко. \ r \ n \ t отбрасывает счет. http://imgur.com/a/l8Zgh – Griven

+0

@Griven: Поскольку «Тринадцать» не заканчивается точкой или вопросительным/восклицательным знаком, это не считается абзацем. И вы не можете удалить условие '(? <= \.)', Потому что в этом случае абзацы, которые используют несколько строк, будут разделены посередине. –

+0

Разделение на символы новой строки и вкладки определяет абзац, который его уничтожает. – sln

0

По какой-то странной причине, это, кажется, работает.
Для этого требуется пустая строка между абзацами.
Нет смысла делать это иначе.

Просто выполните матч, в то время как матч соответствует следующему. Увеличьте счетчик.

# @"(?m-)(?:\A|(?>^[^\S\r\n]*\r?\n){1,}(?!\z))" 

(?xm-) 
(?: 
     \A 
    | (?>^[^\S\r\n]* \r? \n){1,} 
     (?! \z) 
) 
Смежные вопросы