使用split() - java分割一个不被任何东西分隔的数字

Mar*_*idi 2 java split numbers

我假设这是一个很容易回答的问题,我如何拆分数字20120101,例如,使用java中的split()方法来获取2012年,01,01 ...如果是的话,我会知道怎么做用逗号或句号分隔,但是当它没有被任何东西分开时你怎么做?

Jas*_*n C 5

例如,如何使用java中的split()方法分割数字20120101以获得2012,01,01 ...

你不会; split通常用于带有明确分隔符的文本,这些分隔符不属于你的(你可以看到其他答案,但它不是这项工作的最佳工具).你有选择:


编辑:

上面的答案是严肃和善意的.下面的答案纯粹是有趣的废话.

Hovercraft Full Of Eels展示了如何使用正则表达式split().

有点偏离主题,这里有一些其他完全不合适和丑陋的解决方案,没有真正的原因(我不打算发布正则表达式,除非我想出一个特别令人讨厌的解决方案):

使用StringReader:

    StringReader reader = new StringReader("20120101");
    String y, m, d;
    char buffer[];

    buffer = new char[4];
    reader.read(buffer);
    y = new String(buffer);        
    buffer = new char[2];
    reader.read(buffer);
    m = new String(buffer);
    reader.read(buffer);
    d = new String(buffer);
Run Code Online (Sandbox Code Playgroud)

或者是一个非常方便的解决方案,使用修改StringReader后的插入空格和a StreamTokenizer来分割标记:

    StreamTokenizer st = new StreamTokenizer(new StringReader("20120101") {
        private int position = 0;
        @Override public int read () throws IOException {
            switch (++ position) {
            case 5:
            case 8:
                return ' ';
            default:
                return super.read();
            }
        }
        @Override public int read (char[] cbuf, int off, int len) throws IOException {
            for (int n = off; n < off + len; ++ n)
                cbuf[n] = (char)read();
            return len;
        }
        @Override public boolean markSupported () {
            return false;
        }
        @Override public void reset () throws IOException {
            position = 0;
            super.reset();
        }
    });

    st.resetSyntax();
    st.wordChars('0', '9');
    st.whitespaceChars(' ', ' ');
    st.nextToken();
    String y = st.sval;
    st.nextToken();
    String m = st.sval;
    st.nextToken();
    String d = st.sval;
Run Code Online (Sandbox Code Playgroud)

我想你也可以编写一个从stdin读取的程序,在适当的位置插入逗号,然后打印结果.然后,您可以将字符串传递给该程序,读取输出(使用Process),然后split().如果Process过于简单,可以使用类加载器动态加载该程序的类,然后使用反射main在相应地重定向stdin和stdout后调用.