【发布时间】:2012-03-11 23:59:24
【问题描述】:
我想知道如何从一个字符串中解析几个双数,但字符串可以混合,例如:String s = "text 3.454 sometext5.567568more_text"。
标准方法 (Double.parseDouble) 不合适。我尝试使用isDigit 方法解析它,但是如何解析其他字符和.?
谢谢。
【问题讨论】:
标签: java string parsing numbers double
我想知道如何从一个字符串中解析几个双数,但字符串可以混合,例如:String s = "text 3.454 sometext5.567568more_text"。
标准方法 (Double.parseDouble) 不合适。我尝试使用isDigit 方法解析它,但是如何解析其他字符和.?
谢谢。
【问题讨论】:
标签: java string parsing numbers double
您可以搜索following regex:
Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")
然后在每场比赛中使用Double.parseDouble()。
【讨论】:
\\d代替[0-9]
在使用此代码或其他帖子中的合适正则表达式解析您的双打后,迭代以将匹配的双打添加到列表中。在这里,您有 myDoubles 可以在代码中的其他任何地方使用。
public static void main ( String args[] )
{
String input = "text 3.454 sometext5.567568more_text";
ArrayList < Double > myDoubles = new ArrayList < Double >();
Matcher matcher = Pattern.compile( "[-+]?\\d*\\.?\\d+([eE][-+]?\\d+)?" ).matcher( input );
while ( matcher.find() )
{
double element = Double.parseDouble( matcher.group() );
myDoubles.add( element );
}
for ( double element: myDoubles )
System.out.println( element );
}
【讨论】:
X 在双数中的一个数字之后是无效的,当输入是123X 时,您只需忽略它并说输入包含123。什么是规则让你忽略X而不是e...
解析出子串(被空格包围)
使用String.ParseDouble()获取数值
这里有一个例子,使用“split()”来解析(有很多选择):
// http://pages.cs.wisc.edu/~hasti/cs302/examples/Parsing/parseString.html
String phrase = "the music made it hard to concentrate";
String delims = "[ ]+";
String[] tokens = phrase.split(delims);
这是第二种选择:
【讨论】:
您需要考虑要使用哪种算法,因为这并不完全显而易见。如果子字符串是asdf.1asdf,应该将其解析为十进制值0.1 还是简单的1?
另外,一些嵌入的数字可以是负数吗?如果不是,这将大大简化搜索空间。
我认为 aix 使用正则表达式是正确的,因为一旦你想出一个算法,这听起来像是状态机的工作(扫描输入直到你找到一个数字或可选的- 或.,然后查找下一个“非法”字符并正常解析子字符串)。
这是您必须考虑的极端情况 - 例如,如果没有负数,您几乎可以使用 s.split("[^0-9.]") 并过滤掉非空元素。但是,不属于数字的句点字符会吸引您。无论您采用何种解决方案,请考虑是否有任何情况可能导致问题发生。
【讨论】: