2011-04-02 35 views
0

我在需要解析的文件中包含以下内容。如何解析字符串并在Java中找到双打

((-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))。我的问题是从这里去哪里。我如何从这个字符串中提取双打。我曾尝试使用括号作为分隔符,并将所有括号更改为逗号,然后使用逗号作为分隔符,但这两种方式都会给我带来错误。有任何想法吗?

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

你是什么意思,'给你错误'?邮政编码。我们无法猜测到底发生了什么。 – bmargulies 2011-04-02 20:19:15

+0

这里的预期产出/结果是什么?你想从文本中解析出什么? – Sapph 2011-04-02 20:20:38

+3

这听起来像你只是在尝试不同的事情,而没有考虑他们实际做了什么。对于给定的输入行,您需要的输出是什么?向我们展示迄今已尝试的代码。 – 2011-04-02 20:21:42

回答

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 
+0

谢谢,这是我正在寻找的!再次感谢。 – user446836 2011-04-02 20:51:56

+0

@ user446836,不客气。 – 2011-04-02 21:06:24

1

下面是你左场的建议。搜索并替换从()[]的括号,然后只使用现成的JSON解析器。

0

以下正则表达式会捕获这对数字,用逗号分隔,并用附加符号括起来。所以,它给出:((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()); 
    } 
}