JAVA逐行拆分+下一行开始字符

时间:2016-05-25 14:41:57

标签: java string split

我的问题很简单,是否可以使用split方法或类似的东西来分隔换行符和下一行的第一个元素? (使用JAVA)

例如,我将其作为一个字符串:

T | True | 25.05.2016 16:21:59
E | 1 | 2 | 3 | 3 | X |百灵
大号| 2 | 3
大号| 43 | JJJ
E | 2 | 33
H | 24343 | IADS

我想通过换行符和E |拆分它,结果应该是:

第一个字符串:
T | True | 25.05.2016 16:21:59

第二个字符串:
E | 1 | 2 | 3 | 3 | X |百灵
大号| 2 | 3
大号| 43 | JJJ

第三串:
E | 2 | 33
H | 24343 | IADS

有没有办法做到这一点? 谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,据我所知,没有可用的分割方法(在默认的API中)可以拆分并保留你说它要分割的字符(在这种情况下是\n和{ {1}})。据我所知:你想保留E|,但你想'转储'E|。要解决此问题,您可以编写自己的方法来执行此操作。它可能是这样的:

\n

在main方法中,您可以创建字符串变量并为其指定字符串。 (public static void main(String[] args) { String string = "T|True|25.05.2016 16:21:59\n" + "E|1|2|3|3|X|J\n" + "L|2|3\n" + "L|43|JJJ\n" + "E|2|33\n" + "H|24343|IADS"; String[] stringArray = splitTheString(string, new String[] {"E|", "\n"}); for(String s : stringArray) { System.out.println(s); } } )。为了保持整洁,我决定制作一个单独的String string = "your string here"方法。它需要两个参数:首先是你要分割的字符串,第二个是包含字符串的数组,你希望将字符串拆分。

对于方法,我将使用splitTheString()。它以有序的方式自动存储数据,并且不存储重复数据。 我也将使用ArrayList。两者都可以导入以节省一些输入(TreeList),但在本例中我没有这样做。

import java.util.*

好的,我会在某些方面(比如这里)拆分方法来解释发生了什么。首先,我创建了一个TreeSet对象。我将用它来存储找到的索引号。我们将尝试查找子字符串public static String[] splitTheString(String string, String[] regex) { java.util.TreeSet<Integer> list = new java.util.TreeSet<>(); list.add(0); list.add(string.length()); int fromIndex; int toIndex; \n所在位置的索引号。我添加了索引号0(因为我们需要一个起点;字符串是从0开始的,所以我们从0开始)。而且我还添加了字符串的大小(字符串的最后一个索引是大小-1)。

E|

SPLIT - &gt;在下一部分中,我使用了增强的for循环(或foreach循环)。对于数组“regex”中的每个String,我们将String存储在名为 for(String s : regex) { toIndex = 0; while(toIndex >= 0) { fromIndex = toIndex + 1; toIndex = string.indexOf(s, fromIndex); if(toIndex >= 0) list.add(toIndex); } } 的变量中。因此,s首先为s,而E|\n。 在for - 循环中,我有一个while - 循环,它将循环直到toIndex小于零(因此为负)。为什么?我正在使用字符串indexOf方法。它将返回我们正在搜索的String的索引(从您使用参数提供的索引开始)。如果找不到String,它将返回-1。所有这些值都存储在列表中。 (还记得它们是按照正确的顺序排列的吗?)

    java.util.ArrayList<String> stringList = new java.util.ArrayList<>();
    int count = 0;
    while(list.size() > 1) {
        stringList.add(string.substring(list.pollFirst(), list.first()));
        if(stringList.get(count).equals("\n")) stringList.remove(count);
        else count++;
    }

SPLIT - &gt;这是我们创建ArrayList - 对象的地方。它将用于存储您的字符串。因此,我们将使用ArrayList中的add() - 方法将我们的子字符串添加到stringList。要获取我们的子字符串,我们将使用字符串方法substring(fromIndex, toIndex)。它将返回fromIndex到toIndex的子字符串。索引号将从列表中获取(这是一个TreeMap)。我们将使用pollFirst() - 方法(将删除并返回第一个值)和first() - 方法(将返回但不删除第一个值(并且因为您首先删除了第一个值,新的第一个值将是原始的第二个值...依此类推(仍在跟随?))。 我们还将检查子字符串是否不等于\n ..我们不希望将中断存储为单独的字符串值。

    String[] stringArray = new String[count];
    count = 0;
    for(String s : stringList) {
        stringArray[count] = s.replace("\n", "");
        count++;
    }
    return stringArray;
}

所有子字符串都已添加到stringList-object中。现在我们要做的就是将它们添加到一个数组中(如果它是你想要使用的数组)。在将它们添加到数组之前,我们从字符串中删除任何“\ n”,因此您不必为自己没有添加的中断而烦恼。

希望您觉得这个答案很有帮助。如果有任何不清楚的地方或者您对如何改进此答案有任何建议,请发表评论。