【问题标题】:Splitting string N into N/X strings将字符串 N 拆分为 N/X 个字符串
【发布时间】:2010-11-08 22:06:51
【问题描述】:

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

我知道使用分隔符的方法,例如

testString.split(",");

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


更新:根据要求提供一个类似的示例来说明要实现的目标;

String X = "32028783836295C75546F7272656E745C756E742E657865000032002E002E005C0"

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

X[0] = 32028783836295C75546F

X[1] = 6E745C756E742E6578650

x[2] = 65000032002E002E005C0

不用担心解释如何将其放入数组中,我对此没有任何问题,只是不使用分隔符如何拆分,而是算术运算

【问题讨论】:

  • 您能说得更具体些吗?如果你能举个例子说明你想要什么,这会有所帮助。
  • @hal:更新完毕,感谢关注!

标签: java regex string split math


【解决方案1】:

您可以通过拆分 (?<=\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

编辑

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

【讨论】:

  • 再次感谢,嘿!顺便举个例子。放轻松
  • @Bart;如果我可以问,你能告诉我任何你可能知道我可以在哪里进一步学习的网站吗,你似乎对它非常熟悉,从你的回答和问题:) stackoverflow.com/questions/1536915/…
  • @Carlucho,如果你是认真的,你需要书架上的书Mastering Regular Expressions。这是关于正则表达式的书。至于网上参考,大概有很多不错的,不过这个绝对排在前5:regular-expressions.info/tutorial.html
  • @Bart Kiers,哥们,您能否进一步解释一下这个正则表达式中每个字符的作用。谢谢
【解决方案2】:

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

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

splitStrings 中的每个 String(可能除外)的长度为 length。最后一个的长度可能在 1 和 length 之间。

请注意,与String.split 不同,它首先构建一个ArrayList&lt;String&gt;,然后在其上使用toArray() 以产生最终的String[] 结果,Guava 的Splitter 是惰性的,不会对输入字符串做任何事情当split 被调用时。字符串的实际拆分和返回是在您遍历生成的Iterable 时完成的。这允许您只迭代结果而不分配数据结构并将它们全部存储或将它们复制到您想要的任何类型的Collection 中,而无需通过中间ArrayListString[]。根据您要对结果执行的操作,这可能会更加有效。这也比使用正则表达式更清楚你在做什么。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      嗯,我认为这可能与其他任何方法一样有效。

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 嗯不确定这个add 业务
        • 不,数组在 Java 中没有方法。
        • 我确实说过,伪代码。这主要是 Fantom 中添加数组的编程残余。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 2011-09-09
        相关资源
        最近更新 更多