0

我有一个接受 String 参数的方法。

字符串可以包含整数、长整数、双精度、布尔值或只是普通的旧字符和数字。

我需要一种简单的方法来确定字符串的类型。

一种方法可能是拥有一堆 try catch 块并尝试将其解析为每种类型,如果抛出异常,则可能不是该数据类型。这似乎是错误的,因为它是一个启发式程序,而不是一个确定性程序。

4

4 回答 4

2

我认为通常假设您需要知道它是什么——通常这些参数要么是已知的,要么带有一些元数据。您始终可以使用正则表达式来查找诸如数字和句号之类的标记。

有用的模式:

Pattern.compile("(?:\\+|\\-)?\\d+\\.\\d+");` // Matches a double.
Pattern.compile("(?:\\+|\\-)?\\d{numberOfDigitsBeforeYouWantToCallItALong,}"); // Matches longs.
Pattern.compile("(?:\\+|\\-)?\\d{,numberOfDigitsBeforeYouWantToCallItALongMinusOne}"); // Matches ints.
Pattern.compile("true|false|t|f|yes|no|y|n"); // Matches booleans.

其他一切都是字符串。

编辑:从您的编辑中,我看到您已经添加了它的使用方式,您可以使用它"(?:\\+|\\-)?\\d+"来检测数字,如果您的目标类型是 int 或 long,请接受它并将其解析为目标类型,而不是基于数字位数。或者您可以尝试直接解析为适当的类型并捕获Exception,因为无论如何您都知道预期的类型。

于 2012-07-12T08:13:50.193 回答
1

如果您知道参数后应该知道类型应该是什么,那么将字符串解析为该类型并捕获异常是可以的 - 这是使用异常来捕获无效数据的适当使用(只要您只尝试一种类型。 ..)

于 2012-07-12T08:21:56.750 回答
0

There are only 3 special cases: true, false, and a number. Just check if the string is "true", then check if it is "false", then use Double.parseDouble() (since a long can fit in a double). If it isn't equal to true or false, and Double.parseDouble throws an exception, then it is just a string

于 2012-07-12T08:50:03.417 回答
-1

你可以使用 Scanner 类吗?

String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close(); 

会输出

1
2
Red
Blue

可能很复杂或者你想要什么

于 2012-07-12T08:15:07.010 回答