2010-11-08 146 views
2

我想了解如何基于算术运算将字符串拆分为N个单独的字符串的一些指导;例如string.length()/ 300。将字符串N拆分为N/X个字符串

我所知道的方式带分隔符如

testString.split(","); 

,但这样做如何做一个使用贪婪/勉强/占有欲量词与split方法?


更新:根据要求什么我希望获得一个类似的例子;

String X = "32028783836295C75546F7272656E745C756E742E657865000032002E002E005C0" 

在X生成的/ 3 (或多或少...由手工完成)

X[0] = 32028783836295C75546F 

X[1] = 6E745C756E742E6578650 

x[2] = 65000032002E002E005C0 

不要担心,解释如何把它放入数组,我有没有问题,只对如何如果有,你希望每个String是一个固定长度的分割不使用分隔符,但运算

+0

你能更具体?如果你举一个你想要的例子,这将有所帮助。 – Hal 2010-11-08 22:12:06

+0

@hal:完成更新,感谢您的关注! – Carlos 2010-11-08 22:18:58

回答

10

你可以做到这一点通过(?<=\G.{5})分裂,从而字符串aaaaabbbbbccccceeeeefff将分成以下几部分:

aaaaa 
bbbbb 
ccccc 
eeeee 
fff 

\G以前匹配发生的位置(零宽度)的位置相匹配。最初,\G从字符串的开始处开始。请注意,默认情况下,.元字符不匹配换行符,因此如果您希望它匹配每个字符,请启用DOT-ALL:(?s)(?<=\G.{5})

一个演示:

class Main { 
    public static void main(String[] args) { 
    int N = 5; 
    String text = "aaaaabbbbbccccceeeeefff"; 
    String[] tokens = text.split("(?<=\\G.{" + N + "})"); 
    for(String t : tokens) { 
     System.out.println(t); 
    } 
    } 
} 

可以在这里在线测试:http://ideone.com/q6dVB

编辑

既然你问对正则表达式的文档,这里有主题的具体教程建议正则表达式包含:

+0

优秀的答案,正是我所寻找的,欢呼! – Carlos 2010-11-08 22:21:15

+0

再次感谢,嘿!很棒的网站,以举例的方式。放轻松吧 – Carlos 2010-11-08 22:27:35

+0

@Carlucho,不客气! – 2010-11-08 22:27:38

4

,您可以使用GuavaSplitter

int length = string.length()/300; 
Iterable<String> splitStrings = Splitter.fixedLength(length).split(string); 

splitStrings与最后的可能是个例外。每个String将有length的长度。最后的长度可能在1到length之间。

注意,不像String.split,它首先建立一个ArrayList<String>,然后使用toArray()产生最终结果String[],番石榴的Splitter是懒惰,当split被称为不与输入字符串做任何事情。当你遍历结果Iterable时,字符串的实际分割和返回就完成了。这使您可以迭代结果,而无需分配数据结构并将其全部存储,或者将它们复制到任何类型的Collection中,而无需通过中间的ArrayListString[]。根据你想要对结果做什么,这可以更有效。这也是更清楚你在做什么比正则表达式。

1

不知道,你可能需要一个接受字符串和整数次的方法并返回一个字符串列表。伪代码(没有检查它的工作与否):

public String[] splintInto(String splitString, int parts) 
{ 
    int dlength = splitString.length/parts 
    ArrayList<String> retVal = new ArrayList<String>() 
    for(i=0; i<splitString.length;i+=dlength) 
    { 
     retVal.add(splitString.substring(i,i+dlength) 

    } 
    return retVal.toArray() 
} 
+0

嗯不知道这个'add'业务 – 2010-11-08 22:24:25

+0

不,数组在Java中没有方法。 – 2010-11-08 22:29:04

+0

我说过,伪代码。而这主要是Fantom中数组添加的剩余部分。 – 2010-11-08 22:41:20

2

如何处理纯旧的String.substring?这是内存友好(因为它重新使用原始字符数组)。

1

嗯,我认为这可能是一种有效的方法来做到这一点。

int N=300; 
int sublen = testString.length()/N; 
String[] subs = new String[N]; 
for(int i=0; i<testString.length(); i+=sublen){ 
    subs[i] = testString.substring(i,i+sublen); 
} 

,如果你需要的物品作为char[]数组,而你可以做得更快个人Strings - 这取决于你需要如何使用结果 - 例如使用testString.toCharArray()

相关问题