5

我有一个String可能有很多不同的formats. 我需要能够识别值的实际类型,runtime然后将值转换为该类型。

例如。如果我有 aString Fri Feb 08 07:30:00 GMT 2013这实际上是 aDate并且 aString应该被转换成 adate object并返回。

我目前对这个问题的解决方案是“尝试”将其转换为数据类型,如果转换成功则一切正常,如果转换失败则继续进行下一次转换尝试。这可行,但丑陋且不可维护,我确信那里已经存在更好的解决方案。

谢谢。

4

4 回答 4

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;
}
于 2013-02-08T10:49:41.643 回答
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);
    }
}
于 2013-02-08T10:39:32.387 回答
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/

于 2013-02-08T10:31:51.873 回答
0

如果传递给您的字符串超出您的控制范围,您的方法很好。还有一个建议:您应该应用所有可能的转换并检查不明确的字符串。如果多次转换成功,则字符串不明确,您应该进行一些错误处理,可能会引发异常。

于 2013-02-08T10:53:43.013 回答