8

我想读取一个本地 txt 文件并读取该文件中的文本。之后,我想将整个文本拆分为字符串,如下例所示。

示例:假设文件包含 -

 abcdef                                 
 ghijkl

 aededd               
 ededed

 ededfe
 efefeef
 efefeff

 ......
 ......

我想将此文本拆分为字符串

s1 = abcdef+"\n"+ghijkl;

s2 = aededd+"\n"+ededed; 

s3 = ededfe+"\n"+efefeef+"\n"+efefeff;

........................

我的意思是我想在空行上拆分文本。

我确实知道如何读取文件。我需要帮助将文本拆分为字符串

4

6 回答 6

9

您可以通过以下方式将字符串拆分为数组

String.split();

如果你想要换行的话,那就是

String.split("\\n\\n");

更新*

如果我明白你在说什么,那么约翰。

那么你的代码基本上是

BufferedReader in
   = new BufferedReader(new FileReader("foo.txt"));

List<String> allStrings = new ArrayList<String>();
String str ="";
while(true)
{
    String tmp = in.readLine();
    if(tmp.isEmpty())
    {
      if(!str.isEmpty())
      {
          allStrings.add(str);
      }
      str= "";
    }
    else if(tmp==null)
    {
        break;
    }
    else
    {
       if(str.isEmpty())
       {
           str = tmp;
       }
       else
       { 
           str += "\\n" + tmp;
       }
    }
}

可能是您要解析的内容。

allStrings 是所有字符串的列表。

于 2012-04-08T19:48:06.837 回答
6

我会建议更通用的正则表达式:

text.split("(?m)^\\s*$");

在这种情况下,它将在任何行尾约定上正常工作,并且还将处理相同的空行和仅空格行。

于 2013-12-11T14:13:33.580 回答
5

即使有用数据之间有超过 2 个空行,下面的代码也可以工作。

import java.util.regex.*;

// read your file and store it in a string named str_file_data

Pattern p = Pattern.compile("\\n[\\n]+");     /*if your text file has \r\n as the newline character then use Pattern p = Pattern.compile("\\r\\n[\\r\\n]+");*/
String[] result = p.split(str_file_data);

(我没有测试代码,所以可能有错别字。)

于 2012-04-08T20:11:16.243 回答
3

这可能取决于文件的编码方式,因此我可能会执行以下操作:

String.split("(\\n\\r|\\n|\\r){2}");

一些文本文件将换行符编码为“\n\r”,而其他文本文件可能只是“\n”。连续两个新行意味着您有一个空行。

于 2012-04-08T19:52:23.460 回答
3

戈德温走在正确的轨道上,但我认为我们可以把这项工作做得更好一点。在 regx 中使用 '[ ]' 是一个或,所以在他的例子中,如果你有一个 \r\n ,那将只是一个新行而不是一个空行。正则表达式会在 \r 和 \n 上拆分它,我相信在示例中我们正在寻找一个空行,它需要一个 \n\r\n\r,一个 \r\n\ r\n、\n\r\r\n、\r\n\n\r、\n\n 或 \r\r

所以首先我们要查找 \n\r 或 \r\n 两次,两者的任意组合都是可能的。

String.split(((\\n\\r)|(\\r\\n)){2}));

接下来我们需要寻找 \r 后面没有 \n

String.split(\\r{2});

最后,让我们对 \n 做同样的事情

String.split(\\n{2});

所有这些都应该是

String.split("((\\n\\r)|(\\r\\n)){2}|(\\r){2}|(\\n){2}");

请注意,这仅适用于使用新行和字符返回的非常具体的示例。我在 ruby​​ 中可以执行以下操作,这将包含更多案例。我不知道Java中是否有等价物。

.match($^$)
于 2014-11-05T19:21:02.173 回答
0

@Kevin 代码工作正常,正如他提到的代码未经测试,这里是需要的 3 处更改:

1.if check for (tmp==null)应该先来,否则会出现空指针异常。

2.此代码省略了添加到 ArrayList 的最后一组行。为了确保添加最后一个,我们必须在 while 循环之后包含以下代码:if(!str.isEmpty()) { allStrings.add(str); }

3.行str += "\n" + tmp;如果\\n则应改为使用\ n 。请看这个线程的结尾,我已经添加了整个代码以便它可以提供帮助

BufferedReader in
   = new BufferedReader(new FileReader("foo.txt"));

List<String> allStrings = new ArrayList<String>();
String str ="";
List<String> allStrings = new ArrayList<String>();
        String str ="";
        while(true)
        {
            String tmp = in.readLine();
            if(tmp==null)
            {
                break;
            }else if(tmp.isEmpty())
            {
                if(!str.isEmpty())
                {
                    allStrings.add(str);
                }
                str= "";
            }else
            {
                if(str.isEmpty())
                {
                    str = tmp;
                }
                else
                {
                    str += "\n" + tmp;
                }
            }

        }
        if(!str.isEmpty())
        {
            allStrings.add(str);
        }
于 2018-12-06T14:51:26.933 回答