在每第n个位置分割一个string

我使用这个正则expression式在每个第三个位置分割一个string:

String []thisCombo2 = thisCombo.split("(?<=\\G...)"); 

G之后的3个点表示每隔n个位置分割。 在这种情况下,3个点表示每3个位置。 一个例子:

 Input: String st = "123124125134135145234235245" Output: 123 124 125 134 135 145 234 235 245. 

我的问题是,我如何让用户控制的位置数量的string必须拆分? 换句话说,我怎样才能让这3个点,用户控制n个点?

为了提高性能,另一种方法是在循环中使用substring()

 public String[] splitStringEvery(String s, int interval) { int arrayLength = (int) Math.ceil(((s.length() / (double)interval))); String[] result = new String[arrayLength]; int j = 0; int lastIndex = result.length - 1; for (int i = 0; i < lastIndex; i++) { result[i] = s.substring(j, j + interval); j += interval; } //Add the last bit result[lastIndex] = s.substring(j); return result; } 

例:

 Input: String st = "1231241251341351452342352456" Output: 123 124 125 134 135 145 234 235 245 6. 

它不像stevevls的解决scheme那么简短,但是效率更高 (见下文),而且我认为未来的调整会更容易,当然这取决于您的情况。


性能testing(Java 7u45)

长度为2000个字符 – 间隔为3

split("(?<=\\G.{" + count + "})") performance(in miliseconds):

 7, 7, 5, 5, 4, 3, 3, 2, 2, 2 

splitStringEvery()substring() )性能(以毫秒为单位):

 2, 0, 0, 0, 0, 1, 0, 1, 0, 0 

长度为2000000个字符 – 间隔为3

split()性能(以毫秒为单位):

 207, 95, 376, 87, 97, 83, 83, 82, 81, 83 

splitStringEvery()性能(以毫秒为单位):

 44, 20, 13, 24, 13, 26, 12, 38, 12, 13 

长度为2000000个字符 – 间隔为30

split()性能(以毫秒为单位):

 103, 61, 41, 55, 43, 44, 49, 47, 47, 45 

splitStringEvery()性能(以毫秒为单位):

 7, 7, 2, 5, 1, 3, 4, 4, 2, 1 

结论:

splitStringEvery()方法要快得多 (即使在Java 7u6中发生变化之后),并在间隔变大时升级

准备使用的testing代码:

pastebin.com/QMPgLbG9

您可以使用大括号操作符来指定字符必须发生的次数:

 String []thisCombo2 = thisCombo.split("(?<=\\G.{" + count + "})"); 

大括号是一个方便的工具,因为您可以使用它来指定一个确切的计数或范围。

使用谷歌Guava ,你可以使用Splitter.fixedLength()

返回一个将string分割成给定长度的分割符

 Splitter.fixedLength(2).split("abcde"); // returns an iterable containing ["ab", "cd", "e"]. 

如果你想build立这个正则expression式string,你可以设置分割长度作为参数。

 public String getRegex(int splitLength) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < splitLength; i++) builder.append("."); return "(?<=\\G" + builder.toString() +")"; } 
 private String[] StringSpliter(String OriginalString) { String newString = ""; for (String s: OriginalString.split("(?<=\\G.{"nth position"})")) { if(s.length()<3) newString += s +"/"; else newString += StringSpliter(s) ; } return newString.split("/"); }