我有一个非常简单的字符串
"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解决方案才能让这个东西运转起来。
答案 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
中所有字符串的步骤。