将字符串N拆分为N / X字符串

时间:2010-11-08 22:06:51

标签: java regex string split math

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

我知道如何使用

这样的分隔符来实现
testString.split(",");

但是如何使用split方法使用贪婪/不情愿/占有量词?


更新:根据要求,我们希望实现的目标类似;

String X = "32028783836295C75546F7272656E745C756E742E657865000032002E002E005C0"

导致X / 3 (或多或少......手工完成)

X[0] = 32028783836295C75546F

X[1] = 6E745C756E742E6578650

x[2] = 65000032002E002E005C0

不要担心解释如何将它放入数组中,我没有问题,只关于如何在不使用分隔符的情况下进行拆分,而是算术运算

5 个答案:

答案 0 :(得分: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

修改

由于您要求提供有关正则表达式的文档,以下是建议的正则表达式包含的主题的特定教程:

答案 1 :(得分:4)

如果您希望每个String都有固定的长度,则可以使用GuavaSplitter

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

String中的每个splitStrings可能除了最后一个length,其长度为length。最后一个的长度可以介于1和String.split之间。

请注意,与首先构建ArrayList<String>然后使用toArray()生成最终String[]结果的Splitter不同,Guava的split是懒惰的并且在调用Iterable时不对输入字符串执行任何操作。在迭代生成的Collection时,会完成字符串的实际拆分和返回。这允许您只是迭代结果而不分配数据结构并将它们全部存储或将它们复制到您想要的任何类型的ArrayList,而无需通过中间String[]和{{1}}。根据您对结果的要求,这可以更加高效。与正则表达式相比,它还 更清楚你正在做什么。

答案 2 :(得分:2)

普通的旧String.substring怎么样?它的内存友好(因为它重用了原始的char数组)。

答案 3 :(得分:1)

Dunno,你可能需要一个接受string和int次的方法并返回一个字符串列表。伪代码(尚未检查它是否有效):

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()
}

答案 4 :(得分: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()