Java按字符串将字符串拆分为数组,并且仅在分隔符后拆分

时间:2014-09-25 07:02:58

标签: java arrays string string-split

我有很多字符串,它们的大小非常随机:5个字符到12000个随机字符。

例如:

String 1 : A,b,C,d
String 2 :23,343,342,4535,4535,453,234,
String 3 : ,asdsfdfdasgfdsfsf,dsfdsfdsfdsfsdfdf,sdsfdsfdsfsdf, <- and this around another 1000 times.

我想通过他们的ID将它们上传到我的数据库。所以我的问题是oracle数据库varchar只能占用4k字节。

修改 所以如果字符串大于4k。我想要一个String [],其中每个元素最多4000k字符允许计数3900.(并且如果我通过数组我得到相同的字符串,并且每个数组元素最后&#34;字&#34;是一个完整的单词不是切片)

所以我的想法是,如果string.lenth&lt; 1000然后去。 否则将它分成~4000只股票,但只能在昏迷后分开。

到目前为止我的解决方案(没有昏迷关怀)

        for (My_type type: types) {
        String[] tokens =
                Iterables.toArray(
                    Splitter
                        .fixedLength(4000)
                        .split(type.area),
                    String.class
                );

如何更换此功能以获得&#34;良好的数组&#34;?

2 个答案:

答案 0 :(得分:3)

我不认为split()是一种选择。我认为您需要使用Matcher来尽可能多地使用输入,然后构建捕获的部分列表:

Matcher matcher = Pattern.compile(".{1,3999}(,|.$)").matcher(input);
List<String> list = new ArrayList<>();
while (matcher.find())
    list.add(matcher.group());

如果你真的想要一个阵列(不推荐)

String[] array = list.toArray(new String[list.size()]);

这个正则表达式是贪婪的,最多会消耗4000个以逗号或输入结束的字符。长度为3999用于为逗号本身提供1个以上,并且结束标记$之前的点将消耗一个,因为$是零宽度。

答案 1 :(得分:2)

这将在List&lt;&gt;中为您提供此类令牌 - 希望那很好。

for (My_type type: types) {
    String longString = type.area;
    List<String> tokens = new ArrayList<>();
    while (longString.length() > 4000) {
        int splitIndex = longString.lastIndexOf(",", 3999);
        if (splitIndex < 0) {
            // no comma found
            throw new IllegalStateException("Cannot split string");
        }
        tokens.add(longString.substring(0, splitIndex));
        longString = longString.substring(splitIndex + 1); // leaving out the comma
    }
    if (tokens.size() == 0) {
        tokens.add(longString);
    }
}