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
方法解析它,但是如何解析其他字符和

谢谢。

您可以搜索:

然后在每场比赛中使用

  • 解析出子字符串(由空格包围)

  • 使用String.ParseDouble()获取数值

  • 下面是一个示例,使用“split()”进行解析(有许多替代方法):

    还有第二种选择:


    在使用合适的正则表达式(如本代码或其他文章中的正则表达式)解析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 );
    }