如何在java中的正则表达式模式的末尾拆分字符串

时间:2017-06-09 08:18:49

标签: java regex string split

我有一个非常简单的字符串

"aijsdif_213 uweobasjdbfajb
ajksdbfaj-sd_bh kjsham
aisj_drieuku*qger ijwel,34jn
iu32iu4h8heuih+_8u5jns.. iuw&^ijk
.
.
.
.iuwh3iuw"

我希望每隔~1400approx拆分一次。包括换行符在内的字符。

我使用过这样的东西,

Splitter.fixedLength(maxLength).split(biiiigString);

编辑:Splitter来自' com.google.common.base.Splitter '

但是,因为将它拆分为正好1400个字符会在行的中间产生分裂,并且会使拆分字符串无意义地读取。我希望匹配直到行的末尾(即直到下一个换行符)1400个字符匹配,然后拆分字符串。

我尝试了以下检查我的运气,

Splitter.onPattern("(.|\\r\\n){1400}[^\\n]*\\n").split(biiiigString)

但是,这不能分裂,因为这不能忽略直到最后一次突破的角色。

我用Google搜索了很多次但却无法获得任何数据。虽然,我看到像\ K这样的开关语句会忽略之前匹配的所有匹配的regexPatter,但java不支持这种语句。

我需要一个java解决方案才能让这个东西运转起来。

2 个答案:

答案 0 :(得分:3)

我已经使用字符串的substring(int, int)lastIndexOf(str, int)charAt(int)方法来解决这个问题。

charAt(int)用于检查角色是否是空格。如果它不是空格,请在该索引之前检查空间。这是通过lastIndexOf(str, int)实现的。然后从起始索引中选择一个子串到该索引。在结束索引之后重复该过程,直到到达字符串结尾。

结果,我来了:

public List<String> splitBySize(String s, int length) {
    List<String> splits = new ArrayList();
    if (s != null && !s.isEmpty()) {
        int startIndex = 0;
        int endIndex = length;

        while (endIndex < s.length()) {
            if (s.charAt(endIndex) != ' ') {
                endIndex = s.lastIndexOf(' ', endIndex);
                // if endIndex <= startIndex -> strategy?
            }
            splits.add(s.substring(startIndex, endIndex));
            startIndex = endIndex;
            endIndex = startIndex + length;
        }
        // add last part
        splits.add(s.substring(startIndex));
    }
    return splits;
}

但是,必须注意的是,如果在起始索引和起始索引+ 1400个字符之间的子字符串中没有空格,则必须进行额外的检查(请参阅代码中的注释)。它可能不太可能,但请考虑这种情况。要么中断该字符串(从而将endIndex重置回startIndex + length),以便在没有空格的情况下将子字符串分成两部分。

答案 1 :(得分:1)

我不知道是否有内置功能可以做这样的事情。
尝试实施此算法...
1.从结束行字符中将字符串拆分为数组lines 2.通过附加数组和数组中的字符串来创建临时字符串。计数长度 3.重复步骤2,直到临时字符串的长度大于1400 4.在结果数组中添加临时字符串&amp;重复lines中所有字符串的步骤。