我相信大家会从这个人那里得到一个好笑,但是对于我的生活,我找不到一个分隔符,它将指示一个新段落何时开始出现在一串文本中。字和行?容易腻,但段落似乎更难找到。我连续尝试了两个换行符,段落中断和换行符的Unicode表示,没有运气。
编辑:我为我原来问题的模糊性道歉。要回答一些问题,它是最初在Windows上创建的基本文本文件。我正在测试一些代码,用于使用RIM eclipse插件使用Blackberry JDE 4.5打开和分析它的内容。虽然文件的来源是windows(至少在可预见的未来)并且是基本文本,但我无法控制它们是如何创建的(它是第三方来源,我不能访问它的创建方式)答案 0 :(得分:5)
通常使用中没有这样的段落符号。
假设一行中有两个或多个换行符(带有可选的水平空格)表示段落中断,您可以逃脱。但是这个“规则”有很多例外。例如,当一个段落
然后继续...就像这个。对于那种事情,可能没有解决方案。
编辑 / @ Aiden的评论如下。 (现在很明显,这与OP无关,但可能与通过Google等发现问题的其他人相关)
您可以考虑指定您的输入应该是(例如)Markdown语法,而不是尝试从文本中反向设计段落;即由StackOverflow支持。 Markdown Wiki包括许多语言的markdown解析器实现的链接,包括Java。
(这假设你可以控制你试图解析为段落的文本的输入格式,等等。)
答案 1 :(得分:3)
有可能在换行时你需要寻找CR LF序列(\ r \ n) - 显然答案取决于文本格式。
答案 2 :(得分:3)
纯文本文档中的段落通常由两个或多个行分隔符分隔。行分隔符可以是换行符(\n
),回车符(\r
)或回车符后跟换行符(\r\n
)。这三种分隔符通常与操作系统相关联,但任何应用程序都可以使用任何类型的行分隔符自由编写文本。事实上,从不同来源(如网页)组装的文本可能包含两种或更多种分隔符。当您的应用读取文本时,无论它在哪个平台上运行,都应该始终检查所有三种行分隔符。
BufferedReader#readLine()
这样做,但当然它一次只读一行。简单散文通常将作为表示段落的非空行的交替序列返回,并且空行代表它们之间的空格。但不要指望它;注意多个空行,并注意“空”行实际上可能包含空格(\u0020
)和TAB(\u0009
)等空格字符。
如果您选择不使用BufferedReader
,则可能需要从头开始编写检测代码。 Java ME不包含正则表达式支持,因此split()
和java.util.Scanner
不可用;除非使用returnDelims
选项,否则StringTokenizer不会区分单个分隔符和行中的多个分隔符。然后它一次返回一个字符的分隔符,因此您仍然需要编写自己的代码来确定您正在查看的分隔符类型(如果有)。
答案 3 :(得分:2)
String lineSeparator = System.getProperty("line.separator");
这将返回平台的默认行分隔符。
因此,例如以下应该有效:
String[] paragraphs = text.split(lineSeparator);
答案 4 :(得分:2)
我假设您有一个文本文件而不是像MS-Word或RTF这样的复杂文档。
文本文件中段落的概念没有明确定义。大多数情况下新段落将被以下事实识别:当您在文本编辑器中打开文档时,您将看到下一行开始的下一组文本。
有两个特殊字符即。新行(LF - '\n'
)和回车(CR - '\r'
)导致文本在下一行开始。下一行使用哪个字符取决于您使用的操作系统。此外,有时也使用两者的组合,如CRLF('\r\n'
)。
在java中,您可以使用System.getProperty("line.separator");
确定用于分隔行/段落的字符或字符集。但这带来了新的问题。如果在MS Windows中创建文本文件然后在Unix中打开它会怎么样?在这种情况下,文本文件中的行seprator是windows的行,但是java在unix上运行。
我的建议是:
如果文本长度(docuemnt)为零,那么段落= 0。
如果文本长度(docuemnt)不为零,那么
'\n'
和'\r'
视为行
打破角色。请注意,斯蒂芬指出的例外情况也适用于此。
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
答案 5 :(得分:2)
首先,您最好的选择是定义一个段落。无论是换行符,双换行符,还是换行符后面都有换行符。假设您无法控制输入并想要确定各种文本样本中的段落数,则可能存在任何这些情况。此外,它们可能在同一文档中用于相同的目的。因此需要进行一些分析,并记住它不会始终100%准确。
首先初始化各种可能的段落:
以及所有这些,但两次,以及所有那些带有额外制表符('\ t')的变体。
执行此操作的低效方法是将输入加载到字符串中,然后调用buffer.split().length
以确定有多少段落。高效,可扩展的方式是使用流并检查输入,考虑段落的长度,并将这些段落丢弃在给定的“阈值”之下。一个更高级的算法甚至可能会在处理换行符的方式(例如几个非常短的行,或者几个很长的行)中遇到切换后切换它认为是段落的段落。
所有这一切都假设您正在处理没有分区标题等的无格式文本。它归结为询问特定文本中有多少段落的概念就像询问有多少周一年。它不完全是52,但它就在那里。