Android - 如何在字符串中根据换行符(段落)进行分割?

3
我目前正在从一个包含一些段落的文本文件(.txt)中检索一些信息。当我从文本文件中检索字符串时,我希望将其拆分,以便每个段落都在一个字符串对象中。
以下是我从文本文件中获得的文本: http://www.carlowweather.com/plaintext.txt 我尝试使用换行符和回车符来拆分字符串,但似乎都不起作用,请参见下面的代码:
 int pCount=0;
public void parseData(String data){
    String regex = "(\\n)";
    String split[] = data.split(regex);
    for(int i = 0; i<split.length; i++){ 
        Log.e("e", pCount + " " + split[i]);
        pCount ++;
    }
}

我也尝试过使用"\r"和通过搜索网上找到的各种组合,但在Android中似乎都不起作用,我猜测这个文本文件没有包含换行或回车符?只有空行?

最好的方法是将段落分割成字符串对象吗?


1
你可以检查空行 line.trim().equals("") 并在那里中断。 - twain249
4个回答

4
我认为最简单的方法是使用扫描器来实现。
Scanner sc = new Scanner(new File("donal.txt"), "UTF-8");
sc.useDelimiter("\n[ \t]*\n");

List<String> result = new ArrayList<String>();
int lineCount = 0;
while (sc.hasNext())
{
  String line = sc.next();
  System.out.printf("%n%d:%n%s%n", ++lineCount, line);
  result.add(line);
}
System.out.printf("%n%d paragraphs found.%n", lineCount);

第一个和最后一个段落实际上将成为页眉和页脚;我不知道你想如何处理它们。

为了易读性,我假设行分隔符始终为Unix风格的\n,但为了安全起见,你还应该考虑Windows风格的\r\n和旧版Mac风格的\r。 此正则表达式即为:

"(?:\r\n|[\r\n])[ \t]*(?:\r\n|[\r\n])

3
下面的代码将告诉您新段落换行符的位置。在那之后,由您来处理它。它只是查找“”的行。 这是您所引用文件的特性。我已经在下面的代码示例中包含了读取文件的过程,因为您在原始问题中没有指定。我想到的一个想法是,您逐行读取文件,然后尝试在每行上执行regEx。如果将整个文本文件读入一个字符串,则我认为以前的建议将起作用。 另外,您可以将下面的代码分解为另一个函数。
        try {
        BufferedReader in = new BufferedReader(new FileReader("plaintext.txt"));
        String inputDataLine;
        while ((inputDataLine = in.readLine()) != null) {
            if (!(inputDataLine.contentEquals(" "))) {
                System.out.println("What you want to do with a paragraph line");
            } else {
                System.out.println("What you want to do with a paragraph seperator");
            }
        }
        in.close();
    } catch (IOException e) {
    }

2

我认为问题在于段落之间存在多种不同的字符(空格、换行和回车符)。请尝试以下方法:

int pCount=0;
public void parseData(String data){
    String regex = "([ \\t\\r]*\\n[ \\t\\r]*)+"; // Only this line is changed.
    String split[] = data.split(regex);
    for(int i = 0; i<split.length; i++){ 
        Log.e("e", pCount + " " + split[i]);
        pCount ++;
    }
}

很遗憾,它没有起作用,它没有分割任何内容,计数为0,我只得到了完整的字符串返回。不过还是谢谢。 - Donal Rafferty

1

我现在无法在Java中尝试它,但似乎源文件在每行开头(包括空白行)都有一个空格,并且使用<cr><lf>组合来换行。 一个标准的正则表达式来匹配这样的空白行,为了保险起见,考虑到空格,是(引号用于Java字符串定义):

"^ *$"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接