Я предполагаю, что у вас есть текстовый файл, а не сложный документ, такой как MS-Word или RTF.
Понятие абзаца в текстовом документе недостаточно четко определено. В большинстве случаев новый абзац будет распознаваться тем, что при открытии документа в текстовом редакторе вы увидите следующий набор текста, начинающийся со следующей строки.
Есть два специальных символа, а именно. символ новой строки (LF - '\n'
) и возврат каретки (CR - '\r'
), в результате чего текст начинается со следующей строки. Какой символ используется для следующей строки, зависит от используемой вами операционной системы. Более того, иногда комбинация обоих также используется как CRLF ('\r\n'
).
В Java вы можете определить символ или набор символов, используемых для разделения строк / абзацев, используя System.getProperty("line.separator");
. Но это приносит новую проблему. Что если вы создадите текстовый файл в MS Windows, а затем откроете его в Unix? Строковый разделитель в текстовом файле в данном случае - это Windows, но Java работает в Unix.
.
Моя рекомендация:
ЕСЛИ длина текста (документа) равна нулю, ТОГДА абзацы = 0.
ЕСЛИ длина текста (документа) НЕ равна нулю, ТО
- Рассмотрим
'\n'
и '\r'
как строку
символы разрыва .
- Сканирование текста на наличие разрыва строки выше
символы.
- Любые символы непрерывного разрыва строки
в любом порядке следует рассматривать как
один разрыв абзаца .
- Количество абзацев = 1 + (количество
разрывы абзацев)
Обратите внимание, что исключения, указанные Стивеном, все еще применимы и здесь.
.
public class ParagraphTest {
public static void main(String[] args) {
String document =
"Hello world.\n" +
"This is line 2.\n\r" +
"Line 3 here.\r" +
"Yet another line 4.\n\r\n\r" +
"Few more lines 5.\r";
printParaCount(document);
}
public static void printParaCount(String document) {
String lineBreakCharacters = "\r\n";
StringTokenizer st = new StringTokenizer(
document, lineBreakCharacters);
System.out.println("ParaCount: " + st.countTokens());
}
}
выход
ParaCount: 5