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

时间:2010-02-02 22:32:17

标签: java

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

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

6 个答案:

答案 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'视为行 打破角色
  • 扫描上面换行符的文字 字符。
  • 任何连续的换行符 任何顺序都应视为 一个段落
  • 段数= 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

答案 5 :(得分:2)

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

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

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

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

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

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