【问题标题】:How to parse through string and find doubles in Java如何通过字符串解析并在 Java 中查找双精度数
【发布时间】:2011-04-02 20:17:54
【问题描述】:

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

((-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()){

【问题讨论】:

  • “给你错误”是什么意思?邮政编码。我们无法猜测您实际发生了什么。
  • 这里的预期输出/结果是什么?你想从文本中解析什么?
  • 听起来你只是在尝试不同的东西,而没有考虑它们实际上在做什么。对于给定的输入行,您需要什么输出?向我们展示您迄今为止尝试过的代码。
  • 请不要将堆栈跟踪粘贴到评论中。
  • 您还删除了我的编辑,我修复了您的代码格式并将堆栈跟踪放入其中。请向我们展示您的代码。

标签: java string parsing double


【解决方案1】:

您收到的错误消息是因为() 是特殊的正则表达式字符:因此,无论何时要替换(或匹配)它们,都需要使用反斜杠对其进行转义:

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

也就是说,您可能希望在此处使用 Pattern/Matcher 方法:

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

【讨论】:

  • 谢谢,这正是我想要的!再次感谢。
【解决方案2】:

这是给您的左侧字段建议。从() 中搜索括号并将其替换为[],然后只需使用现成的JSON 解析器即可。

【讨论】:

    【解决方案3】:

    下面的 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());
        }
    } 
    

    【讨论】:

      猜你喜欢
      • 2012-10-21
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多