2

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

4

3 回答 3

5

例如,我将如何拆分数字 20120101,使用 java 中的 split() 方法获取 2012、01、01 ...

你不会;split通常用于带有显式分隔符的文本,而您的则没有(您可以查看其他答案,但这不是该工作的最佳工具)。您有以下选择:

  • 用于String.substring拉出特定位置的子串。例如:

    String m = "20120101".substring(4, 6);
    
  • 使用 aSimpleDateFormat来解析日期。例如:

    Date d = new SimpleDateFormat("yyyyMMdd").parse("20120101");
    
  • 使用数学(尽管考虑到您的输入应该是日期,因此语义上并不真正合适)。例如:

    int number = Integer.parseInt("20120101");
    int y = number / 10000;
    int m = (number / 100) % 100;
    int d = number % 100;
    


编辑:

上面的回答是严肃而善意的。下面的答案纯粹是有趣的废话。

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

或者一个非常方便的解决方案,使用修改后StringReader的插入空格和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;

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

于 2013-11-04T01:30:24.130 回答
3

尝试这个:

String date = "20120101";

String year = date.substring(0, 4);
String month = date.substring(4, 6);
String day = date.substring(6, 8);

或使用SimpleDateFormatand Calendar

String date = "20120101";
DateFormat df = new SimpleDateFormat("yyyyMMdd");
Calendar cal = Calendar.getInstance();
try {
    cal.setTime(df.parse(date));
} catch (ParseException e) {
    e.printStackTrace();
    // Could not parse date.
    // Break execution.
}
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
于 2013-11-04T01:28:52.257 回答
2

正如我在评论中所说,尝试使用 split(...) 就像尝试使用香蕉作为锤子一样。当然,在某种程度上,你最终可能会完成某种工作,但这会很痛苦,而且结果也不是很可靠。为工作使用正确的工具。

所以这里是一个丑陋的例子 h3ll split(...),只是为了咧嘴笑而发布的:

import java.util.Arrays;

public class DumbSplit {
   public static void main(String[] args) {
      String dateStr = "20120101";

      String bananaAsHammer = "(?<=.{4}).*(?=.{4})|(?<=.{6}).*(?=.{2})";
      String[] tokens = dateStr.split(bananaAsHammer);

      System.out.println(Arrays.toString(tokens));
   }
}
于 2013-11-04T01:52:33.153 回答