如何确定字符串中包含的数据类型?
我有一个接受String参数的方法。
String可以包含整数,long,double,boolean或只是普通的旧字符和数字。
我需要一种简单的方法来确定字符串的类型。
一种方法可能是拥有一堆try catch块并尝试将其解析为每种类型,如果抛出exception,那么它可能不是那种数据类型。 这似乎是错误的,因为它是一种启发式方法,而不是一种确定性方案。
如果您知道参数后知道类型应该是什么,那么将字符串解析为该类型并捕获exception就可以了 – 这是适当使用exception来捕获无效数据(只要您只尝试一种类型。 ..)
我认为通常假设您需要知道它是什么 – 通常这些参数是已知的或带有一些元数据。 您始终可以使用正则表达式来查找数字和句点等标记。
实用模式:
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.
其他一切都是String。
编辑:从您的编辑中我看到您已经添加了它的使用方式,您可以使用"(?:\\+|\\-)?\\d+"
来检测数字,如果您的目标类型是int或者long,接受它并将其解析为目标类型而不是基于位数。 或者您可以尝试直接解析为适当的类型并捕获Exception
,因为您无论如何都知道预期的类型。
只有3种特殊情况:真,假和数字。 只检查字符串是否为“true”,然后检查它是否为“false”,然后使用Double.parseDouble()(因为long可以放在double中)。 如果它不等于true或false,并且Double.parseDouble抛出exception,那么它只是一个字符串
你能用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
可能是复杂或你想要的东西