我假设这是一个容易回答的问题,例如,我将如何拆分一个数字 20120101,使用 java 中的 split() 方法来获取 2012、01、01 ......如果是的话,我会知道该怎么做用逗号或句点分隔,但是当它没有被任何东西分隔时,你怎么做?
3 回答
例如,我将如何拆分数字 20120101,使用 java 中的 split() 方法获取 2012、01、01 ...
你不会;split
通常用于带有显式分隔符的文本,而您的则没有(您可以查看其他答案,但这不是该工作的最佳工具)。您有以下选择:
用于
String.substring
拉出特定位置的子串。例如:String m = "20120101".substring(4, 6);
使用 a
SimpleDateFormat
来解析日期。例如: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
重定向您的标准输入和标准输出后使用反射来调用。
尝试这个:
String date = "20120101";
String year = date.substring(0, 4);
String month = date.substring(4, 6);
String day = date.substring(6, 8);
或使用SimpleDateFormat
and 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);
正如我在评论中所说,尝试使用 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));
}
}