我有一个String
可能有许多不同的formats
。我需要能够在runtime
识别值的实际类型,然后将值转换为该类型。
例如。如果我有String
Fri Feb 08 07:30:00 GMT 2013
,那么这实际上是Date
,而String
应该转换为date object
,然后按原样返回。
我目前解决此问题的方法是“尝试”将其转换为数据类型,如果转换成功则一切正常,如果转换失败,则转到下一次转换尝试。这是有效的,但是很丑陋且难以维护,我确信那里已经存在更好的解决方案。
感谢。
答案 0 :(得分:4)
您可以为每种数据类型使用单独的正则表达式,如下所示:
private final static Pattern DATE_PATTERN =
Pattern.compile (
"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat) " +
"(?:Jan|Feb|Mar|Apr|May|June?|July?|Aug|Sept?|Oct|Nov|Dec) " +
"\\d\\d \\d\\d:\\d\\d:\\d\\d \\S+ \\d\\d\\d\\d");
private final static Pattern DOUBLE_PATTERN =
Pattern.compile (
"[\\+\\-]?\\d+\\.\\d+(?:[eE][\\+\\-]?\\d+)?");
private final static Pattern INTEGER_PATTERN =
Pattern.compile (
"[\\+\\-]?\\d+");
public static Object stringToObject (String string)
{
if (DATE_PATTERN.matcher (string).matches ())
return stringToDate (string);
else if (DOUBLE_PATTERN.matcher (string).matches ())
return Double.valueOf (string);
else if (INTEGER_PATTERN.matcher (string).matches ())
return Integer.valueOf (string);
else return string;
}
答案 1 :(得分:1)
public static void main(String[] args) {
String s = "Fri Feb 08 07:30:00 GMT 2013";
SimpleDateFormat FT = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy");
Date d;
try {
d = FT.parse(s);
System.out.println(d);
} catch (ParseException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
}
答案 2 :(得分:0)
尝试正则表达式: 您可以为每种数据类型编写一个模式,然后将该模式与每个匹配每个匹配转换的实际字符串相匹配。 这是一个简单的例子(在伪Java中):
String name = "Mike"; // This is an English name
String nameRegEx ="[A-Z][a-z]+"; //this patterns matches an english name
Matcher nameMatcher = new Matcher(regEx);
if (match.matches(name)){// I use the matches() method to verify the format of the string
Name nameObject = Converter.getNameObjectFromString(name);//I make the conversion
}
查看java文档以获取有关匹配器和正则表达式的更多详细信息: http://docs.oracle.com/javase/tutorial/essential/regex/
答案 3 :(得分:0)
如果传递给你的字符串超出你的控制范围,你的方法就可以了。还有一个建议:您应该应用每个可能的转换并检查不明确的字符串。如果多次转换成功,那么字符串是不明确的,你应该做一些错误处理,可能会抛出异常。