我有一个接受 String 参数的方法。
字符串可以包含整数、长整数、双精度、布尔值或只是普通的旧字符和数字。
我需要一种简单的方法来确定字符串的类型。
一种方法可能是拥有一堆 try catch 块并尝试将其解析为每种类型,如果抛出异常,则可能不是该数据类型。这似乎是错误的,因为它是一个启发式程序,而不是一个确定性程序。
我认为通常假设您需要知道它是什么——通常这些参数要么是已知的,要么带有一些元数据。您始终可以使用正则表达式来查找诸如数字和句号之类的标记。
有用的模式:
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
,因为无论如何您都知道预期的类型。
如果您知道参数后应该知道类型应该是什么,那么将字符串解析为该类型并捕获异常是可以的 - 这是使用异常来捕获无效数据的适当使用(只要您只尝试一种类型。 ..)
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
你可以使用 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
可能很复杂或者你想要什么