如何解析字符串并在Java中查找双精度数

时间:2011-04-02 20:17:55

标签: java string parsing double

我在需要解析的文件中有以下内容。

((-2, -1 ), ( 4, 2) ) ((-1.2, 0), (0, 0)) 
((0, 0), (10, -1)) 
((5, 3), (5, 4)) ((5, 1) , (5, 5)) 
((8, 3), (10, 3)) 
((8, 5), (11.5, 5)) 

到目前为止,我已经扫描了文件并逐行获取输入,将它们保存为字符串,因此一个字符串将是((-2,-1),(4,2))(( - 1.2, 0),(0,0))。我的问题是从哪里开始。如何从此String中提取双精度数。我试图将括号用作分隔符,并将所有括号更改为逗号,然后使用逗号作为分隔符,但这两种方式都会给我带来错误。有什么想法吗?

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 1 at java.util.regex.Pattern.error(Unknown Source) at
    java.util.regex.Pattern.accept(Unknown Source) at
    java.util.regex.Pattern.group0(Unknown Source) at
    java.util.regex.Pattern.sequence(Unknown Source) at
    java.util.regex.Pattern.expr(Unknown Source) at
    java.util.regex.Pattern.compile(Unknown Source) at
    java.util.regex.Pattern.<init>(Unknown Source) at
    java.util.regex.Pattern.compile(Unknown Source) at
    java.lang.String.replaceAll(Unknown Source)

这样做的目的是从这些双打中创造积分。例如,((0,0),(10,-1))将创建两个点,(0,0)和(10,-1)。我创建了点类,它在构造函数中包含两个双精度数。 这是我试过的:

      String toParse = "((0, 0), (10, -1))";
    toParse.replaceAll("(", ",");
    toParse.replaceAll(")", ",");
    Scanner stringScanner = new Scanner(toParse);
    stringScanner.useDelimiter(",");
    while(stringScanner.hasNextDouble()){

ECT

3 个答案:

答案 0 :(得分:4)

您收到的错误消息是因为()是特殊的正则表达式字符:所以每当您想要替换(或匹配)它们时,您需要使用反斜杠转义它们:

toParse.replaceAll("\\(", ",");
...

那就是说,你可能想在这里使用模式/匹配器方法:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {

        String source =
                "((-2, -1 ), ( 4, 2) ) ((-1.2, 0), (0, 0))  \n" +
                "((0, 0), (10, -1))                         \n" +
                "((5, 3), (5, 4)) ((5, 1) , (5, 5))         \n" +
                "((8, 3), (10, 3))                          \n" +
                "((8, 5), (11.5, 5))                        \n";

        Matcher m = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(source);

        while(m.find()) {
            double value = Double.parseDouble(m.group());
            System.out.println("value=" + value);
        }
    }
}

产生:

value=-2.0
value=-1.0
value=4.0
value=2.0
value=-1.2
value=0.0
value=0.0
value=0.0
value=0.0
value=0.0
value=10.0
value=-1.0
value=5.0
value=3.0
value=5.0
value=4.0
value=5.0
value=1.0
value=5.0
value=5.0
value=8.0
value=3.0
value=10.0
value=3.0
value=8.0
value=5.0
value=11.5
value=5.0

代码的作用:它搜索模式-?\d+(\.\d+)?并将匹配所述模式的每个字符串解析为double。模式本身意味着:

-?         # an optional minus sign
\d+        # followed by one or more digits
(\.\d+)?   # followed by an optional decimal DOT with one or more digits

答案 1 :(得分:1)

这是给你的左栏建议。搜索并替换()[]的括号,然后使用现成的JSON解析器。

答案 2 :(得分:0)

以下RegEx将捕获这对数字,用逗号分隔并用括号括起来。所以,它给出了:((4,2),它应该捕获:4,2并且给定:( -1.0,0)它将捕获-1.0,0。从那时起,您可以将字符串分割为,修剪前导和尾随空格,并将余数解析为Double。

Pattern p = Pattern.compile("\(([^(]+,[^)]+)\)");
Matcher matcher = p.matcher("((-2, -1 ), ( 4, 2) ) ((-1.2, 0), (0, 0))");
while (matcher.find()) 
{
    String str = matcher.group(); // this should in turn take the following values
                                  // -2, -1 
                                  //  4, 2
                                  // -1.2, 0
                                  // 0, 0
    String[] numbers = str.split(",");
    if(numbers.length == 2)
    {
        // numbers[0] should be the first coordinate
        // and numbers[1] should be the second
        Double first = new Double(numbers[0].trim());
        Double second = new Double(numbers[1].trim());
    }
}