Java 解析字符串中的多个double
我想知道如何解析一个字符串中的几个双精度数字,但字符串可以是混合的,例如:Java 解析字符串中的多个double,java,string,parsing,numbers,double,Java,String,Parsing,Numbers,Double,我想知道如何解析一个字符串中的几个双精度数字,但字符串可以是混合的,例如:string s=“text 3.454 sometext5.567568 more\u text” 标准方法(Double.parseDouble)不合适。我尝试使用isDigit方法解析它,但是如何解析其他字符和 谢谢。您可以搜索: 然后在每场比赛中使用 解析出子字符串(由空格包围) 使用String.ParseDouble()获取数值 下面是一个示例,使用“split()”进行解析(有许多替代方法): 还有第二种选择
string s=“text 3.454 sometext5.567568 more\u text”
标准方法(Double.parseDouble
)不合适。我尝试使用isDigit
方法解析它,但是如何解析其他字符和
谢谢。您可以搜索:
然后在每场比赛中使用
在使用合适的正则表达式(如本代码或其他文章中的正则表达式)解析double后,迭代将匹配的double添加到列表中。这里有
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 );
}
publicstaticvoidmain(字符串参数[])
{
字符串输入=“text 3.454 sometext5.567568更多文本”;
ArrayListmyDoubles=新的ArrayList();
Matcher Matcher=Pattern.compile(“[-+]?\\d*\\.?\\d+([eE][-+]?\\d+))).Matcher(输入);
while(matcher.find())
{
double元素=double.parseDouble(matcher.group());
myDoubles.add(元素);
}
for(双元素:myDoubles)
系统输出打印项次(元素);
}
您需要考虑使用哪种算法来实现这一点,因为这并不完全显而易见。如果子字符串是asdf.1asdf
,那么应该将其解析为十进制值0.1
,还是仅解析为1
此外,一些嵌入的数字是否可以是负数?如果没有,这将大大简化搜索空间
我认为aix使用正则表达式是正确的,因为一旦您提出了一种算法,这听起来就像是状态机的工作(扫描输入,直到您找到一个数字或可选的-
或
,然后查找下一个“非法”字符并正常解析子字符串)
但是,您必须考虑边缘情况-例如,如果没有负数,您几乎可以使用
s.split([^0-9.])
过滤掉非空元素。但是,不属于数字的句点字符将使您获得。无论您使用什么解决方案,都要考虑是否有任何情况会使其出错。您也可以使用\\d
而不是[0-9]如果您选择使用正则表达式,这里有另一个很好的链接:如果您可以节省一些cpu时钟周期,则正则表达式是一种解决方法。它无法正确解析双精度表达式。例如,如果我有一个像“sdf9.99e.23”这样的字符串,它解析9.99,或者当我修改它时,它给出9.99e23,但是!它应该抛出一些异常或返回false(或其他东西,但不是一个双精度值),在这种情况下它不应该返回双精度值我想这正是我想要的!它不能正确地解析double。例如,如果我有一个像“sdf9.99e.23”这样的字符串,它解析9.99,或者当我修改它时,它给出9.99e23,但是!它应该抛出一些异常或返回false,在这种情况下它不应该返回double值,因为9.99e是double,正如您所知,“e”用于double的科学表示法,如果您不想解析它们,请在代码中从正则表达式中删除[eE]。@Helgus Input“sdf9.99e.23”包含两个double:9.99和0.23,您将看到这些与正则表达式匹配,并将成为输出。我的回答对你原来的问题是有效的,它没有具体说明你现在说的是什么。你应该换个问题问。顺便说一下,我的答案中的正则表达式是一般的双正则表达式。@Helgus:是的,我明白。但是,例如,X
在一个双精度数字后面是无效的,当输入是123X
时,您只需忽略它,并说输入包含123
。什么规则使您忽略X
,而不忽略e
。。。
// 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);
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 );
}