在java

时间:2017-03-29 09:08:55

标签: java parsing

我正在尝试从.txt文件中拆分一些简单数据。我在互联网上找到了一些有用的结构,但这还不足以按我想要的方式分割数据。我得到一个这样的字符串:

{X:0.8940594 Y:0.6853521 Z:1.470214} 

我想把它变成这样的;

0.8940594
0.6853521
1.470214

然后按X = [],Y = [],Z = []的顺序将它们放入矩阵中; (数据是对象的坐标)

这是我的代码:

BufferedReader in = null; {
        try {
            in = new BufferedReader(new FileReader("file.txt"));
            String read = null;
            while ((read = in.readLine()) != null) {
                String[] splited = read.split("\\s+");
                for (String part : splited) {
                    System.out.println(part);
                }
            }
        } catch (IOException e) {
            System.out.println("There was a problem: " + e);
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (Exception e) {
            }
        }
    } 

我需要在代码中添加什么才能以我想要的方式获取数据?

现在使用此代码我会收到如下数据:

{X:0.8940594
Y:0.6853521
Z:1.470214}

5 个答案:

答案 0 :(得分:4)

您可以尝试使用类似于以下内容的正则表达式来匹配和捕获每个元组中包含的三个数字:

{\s*X:(.*?)\s+Y:(.*?)\s+Z:(.*?)\s*}

括号中包含的每个数量都是捕获组,并且在匹配发生后可用。

int size = 100;  // replace with actual size of your vectors/matrix
double[] A = new double[size];
double[] B = new double[size];
double[] C = new double[size];
String input = "{X:0.8940594 Y:0.6853521 Z:1.470214}";
String regex = "\\{\\s*X:(.*?)\\s+Y:(.*?)\\s+Z:(.*?)\\s*\\}";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
int counter = 0;
while (m.find()) {
    A[counter] = Double.parseDouble(m.group(1));
    B[counter] = Double.parseDouble(m.group(2));
    C[counter] = Double.parseDouble(m.group(3));
    ++counter;
}

答案 1 :(得分:1)

您可以使用此正则表达式-?\d+\.\d+,例如:

String input = "{X:0.8940594 Y:0.6853521 Z:1.470214}";

Pattern pattern = Pattern.compile("-?\\d+\\.\\d+");
Matcher matcher = pattern.matcher(input);

List<String> result = new ArrayList<>();
while (matcher.find()) {
    result.add(matcher.group());
}
System.out.println(result);

如果您想匹配实际号码,可以查看Regex

答案 2 :(得分:1)

此代码将解决您的问题。

String input = "{X:0.8940594 Y:0.6853521 Z:1.470214} ";
        String[] parts = input.split("(?<= )");
        List<String> output = new ArrayList();

        for (int i = 0; i < parts.length; i++) {
            //System.out.println("*" + i);
            //System.out.println(parts[i]);
            String[] part = parts[i].split("(?<=:)");
            String[] temp = part[1].split("}");
            output.add(temp[0]);
        }

        System.out.println("This List contains numbers:" + output);

输出 - &gt;此列表包含数字:[0.8940594,0.6853521,1.470214]

答案 3 :(得分:0)

这个怎么样?

public class Test {
    public static void main(String[] args) {
        String s = "{X:0.8940594 Y:0.6853521 Z:1.470214}";
        String x = s.substring(s.indexOf("X:")+2, s.indexOf("Y:")-1);
        String y = s.substring(s.indexOf("Y:")+2, s.indexOf("Z:")-1);
        String z = s.substring(s.indexOf("Z:")+2, s.lastIndexOf("}"));
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
    }
}

答案 4 :(得分:0)

你的正则表达式在空格上分裂,但不会删除大括号。

因此,不是在空格上拆分,而是拆分字符的:空格和花括号。
然后正则表达式的行变为:

String[] splited = read.split("[\\s+\\{\\}]");

这是一个包含完整代码段的ideone link

在此之后,您将要在:上拆分生成的三行,并解析右侧。您可以使用Double.parseDouble来实现此目的。

就个人而言,我会尽量避免使用长正则表达式;它们很难调试 最好先删除花括号,然后将结果拆分为空格和冒号。这是更多的代码行,但它更健壮,更容易调试。