可以用什么字符来解析Java段落?

我相信人们会从这个人那里得到一个好笑,但对于我的生活,我找不到一个分隔符,它将指示一个新段落何时以一串文字开始。 字和行? 容易腻,但段落似乎更难找到。 我连续尝试了两个换行符,段落中断和换行符的Unicode表示,没有运气。

编辑:我为我原来问题的模糊性道歉。 要回答一些问题,它是最初在Windows上创建的基本文本文件。 我正在测试一些代码,用于使用RIM eclipse插件使用Blackberry JDE 4.5打开和分析它的内容。 虽然文件的来源是windows(至少在可预见的未来)并且是基本文本,但我无法控制它们的创建方式(它是第三方来源,我不能访问它的创建方式)

通常使用中没有这样的段落符号。

假设一行中有两个或多个换行符(带有可选的水平空格)表示段落中断,您可能会逃脱。 但是这个“规则”有很多例外。 例如,当一个段落

  • 被浮动的人物打断,或
  • 包含要点

然后继续…就像这个。 对于那种事情,可能没有解决方案。

编辑 @Aiden的评论如下。 (现在很明显,这与OP无关,但可能与通过Google等发现问题的其他人相关)

您可以考虑指定您的输入应该是(例如) Markdown语法,而不是尝试从文本中反向设计段落; 即由StackOverflow支持。 Markdown Wiki包含许多语言(包括Java)中的markdown解析器实现的链接。

(这假设您可以控制要尝试解析为段落的文本的输入格式,等等。)

相反,您可能需要寻找CR LF序列(\ r \ n) – 显然答案取决于文本格式。

纯文本文档中的段落通常由两个或多个行分隔符分隔。 行分隔符可以是换行符( \n ),回车符( \r )或回车符后跟换行符( \r\n )。 这三种分隔符通常与操作系统相关联,但任何应用程序都可以使用任何类型的行分隔符自由编写文本。 事实上,从不同来源(如网页)组装的文本可能包含两种或更多种分隔符。 当您的应用程序读取文本时,无论它在哪个平台上运行,都应该始终检查所有三种行分隔符。

BufferedReader#readLine()这样做,但当然它一次只能读取一行。 简单散文通常将作为表示段落的非空行的交替序列返回,并且空行代表它们之间的空格。 但不要指望它; 注意多个空行,并注意“空”行实际上可能包含空格字符,如空格( \u0020 )和TAB( \u0009 )。

如果您选择不使用BufferedReader ,则可能必须从头开始编写检测代码。 Java ME不包含正则表达式支持,因此split()java.util.Scanner不可用; 除非使用returnDelims选项,否则StringTokenizer不会区分单个分隔符和行中的多个分隔符。 然后它一次返回一个字符的分隔符,因此您仍然需要编写自己的代码来确定您正在查看的分隔符类型(如果有)。

 String lineSeparator = System.getProperty("line.separator"); 

这将返回平台的默认行分隔符。

因此,例如以下应该起作用:

 String[] paragraphs = text.split(lineSeparator); 

我假设您有一个文本文件,而不是像MS-Word或RTF这样的复杂文档。

文本文件中段落的概念没有明确定义。 大多数情况下新段落将被以下事实识别:当您在文本编辑器中打开文档时,您将看到下一行开始的下一组文本。

有两个特殊字符即。 新行(LF – '\n' )和回车符(CR – '\r' )导致文本在下一行开始。 下一行使用哪个字符取决于您使用的操作系统。 此外,有时也使用两者的组合,如CRLF( '\r\n' )。

在java中,您可以使用System.getProperty("line.separator");确定用于分隔行/段落的字符或字符集System.getProperty("line.separator"); 。 但这带来了新的问题。 如果在MS Windows中创建文本文件然后在Unix中打开它会怎么样? 在这种情况下,文本文件中的行seprator是windows的行,但是java在unix上运行。

我的建议是:

如果文本长度(docuemnt)为零,那么段落= 0。

如果文本长度(docuemnt)不为零,那么

  • '\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 

首先,你最好的选择是定义一个段落。 无论是换行符,双换行符还是换行符后跟一个制表符。 假设您无法控制输入并想要确定各种文本样本中的段落数,则可能存在任何这些情况。 此外,它们可能在同一文档中用于相同的目的。 因此需要进行一些分析,并记住它不会始终100%准确。

首先初始化各种可能的段落:

  • “\ r”
  • “\ n \ r”
  • “\ n”
  • System.getProperty( “line.seperator”)

以及所有这些,但两次,以及所有那些带有额外制表符(’\ t’)的变体。

执行此操作的低效方法是将输入加载到字符串中,然后调用buffer.split().length来确定有多少段落。 高效,可扩展的方式是使用流并检查输入,考虑段落的长度,并将这些段落丢弃到给定的“阈值”之下。 更先进的算法甚至可以在处理换行符的方式(例如,几个非常短的行,或者几个很长的行)中遇到切换之后切换它认为是段落的段落。

所有这一切都假设您正在处理没有分区标题的无格式文本等。它归结为询问特定文本中有多少段落的概念就像询问一年中有多少周。 它不完全是52,但它就在那里。