用于java拆分的正则表达式

用于java拆分的正则表达式,java,regex,split,Java,Regex,Split,我想从具有以下格式的文件中分割数据: {[(1;1;2)、(5;1;2)、(5;1;1)],[(1;3;2)、(5;3;2)、(5;1;2)] 下面是我的Java方法: public void createFromFile(String filename) throws IOException{ BufferedReader br = new BufferedReader(new FileReader(filename)); String s; while ((s = b

我想从具有以下格式的文件中分割数据: {[(1;1;2)、(5;1;2)、(5;1;1)],[(1;3;2)、(5;3;2)、(5;1;2)]

下面是我的Java方法:

public void createFromFile(String filename) throws IOException{
    BufferedReader br = new BufferedReader(new FileReader(filename));
    String s;
    while ((s = br.readLine()) != null) 
    {
        s = s.replace("{", "").replace("}", "").replace("]", "").replace(",", "");
        ArrayList<Surface> sf = new ArrayList<Surface>();
        for(String s1: s.split("\\["))
        { // <== not splitting here
            ArrayList<Point> tp = new ArrayList<Point>();
            for(String s2: s1.split("\\("))
            { // <== here neither
                String[] s3 = s2.split(";");
                tp.add(new Point(Double.valueOf(s3[0]),Double.valueOf(s3[1]),Double.valueOf(s3[2])));
            }
            sf.add(new Surface((Point[]) tp.toArray()));
        }
        convShape.add(new Body((Surface[])sf.toArray()));   
    }
}
public void createFromFile(字符串文件名)引发IOException{
BufferedReader br=新的BufferedReader(新文件读取器(文件名));
字符串s;
而((s=br.readLine())!=null)
{
s=s.replace(“{,”).replace(“},”).replace(“]”,”).replace(“,”,”);
ArrayList sf=新的ArrayList();
用于(字符串s1:s.split(“\\[”)

{/嗯,它闻起来像JSON,但是如果你想使用split,那么

  • 要获取组,请查找
    /[\\d;]+/
  • 要从组中获取数字,请使用split using
    “;”

演示:
输出:
测试这个演示。

好吧,我认为应该可以。就您当前的代码而言,它应该正确地分割它

但是,考虑到你只想把
数字
放在括号内。你不需要在这里进行
拆分
。你的工作很困难。你最好使用
模式
匹配器
类,找到介于
之间的所有内容。你可以使用下面的代码寻求帮助:-

    String str = "{[(1;1;2),(5;1;2),(5;1;1)],[(1;3;2),(5;3;2),(5;1;2)]}";

    Pattern pattern = Pattern.compile("(\\(\\d;\\d;\\d\\),?){3}");
    Matcher matcher = pattern.matcher(str);

    while (matcher.find()) {
        int i = 1;
        System.out.println("Polygon Coordinates: ");
        String[] coordinates = matcher.group(0).split(",");

        for (String point: coordinates) {
            System.out.println("Coordinate " + (i++) + ": " + point);

            point = point.replace("\\(", "").replace("\\)", "");
            String[] s3 = point.split(";");
            tp.add(new Point(Double.valueOf(s3[0]), Double.valueOf(s3[1]),
                             Double.valueOf(s3[2])));

        }

        sf.add(new Surface((Point[]) tp.toArray()));
        System.out.println();
    }
输出:-

Polygon Coordinates: 
Coordinate 1: (1;1;2)
Coordinate 2: (5;1;2)
Coordinate 3: (5;1;1)

Polygon Coordinates: 
Coordinate 1: (1;3;2)
Coordinate 2: (5;3;2)
Coordinate 3: (5;1;2)
说明:-

Polygon Coordinates: 
Coordinate 1: (1;1;2)
Coordinate 2: (5;1;2)
Coordinate 3: (5;1;1)

Polygon Coordinates: 
Coordinate 1: (1;3;2)
Coordinate 2: (5;3;2)
Coordinate 3: (5;1;2)
  • (\\(\\d;\\d;\\d\\),?){3}
    -这匹配
    3组
    3个整数
    ,由
    分隔;
    括号内
    ,其中
    逗号(,)
    分隔。然后它捕获完整的匹配

  • matcher.find()
    -查找字符串中与上述模式匹配的所有内容

  • matcher.group(0)
    -获取完整匹配

  • 逗号(,)
    上拆分完整匹配以获得单个坐标

  • 如果要匹配由
    分隔的
    double
    integer
    值,则需要稍微更改
    正则表达式

  • 有关上述正则表达式中各种
    量词
    {3}
    的更多详细信息,请参见


更好的方法是分组匹配所需数据

Matcher matcher1 = Pattern.compile("(?<=\\{).*?(?<=\\})").matcher(yourInput);
while(mather1.find())
{
    Matcher matcher2 = Pattern.compile("(?<=\\[).*?(?=\\])").matcher(matcher1.Group());
    while (matcher2.find()) 
    {
        Matcher matcher3 = Pattern.compile("(\\d+);(\\d+);(\\d+)").matcher(matcher2.Group());
    while (matcher3.find()) 
    {

        tp.add(new Point(Double.valueOf(matcher3.Group(1),Double.valueOf(matcher3.Group(2)),Double.valueOf(matcher3.Group(3))));
    }
       sf.add(new Surface((Point[]) tp.toArray()));  
    }
convShape.add(new Body((Surface[])sf.toArray()));   
}

Matcher matcher1=Pattern.compile((?对不起,我现在就编辑它。所以你想要括号中的所有数字,但也希望它们按“(”“)”分组,然后按“[”“]”分组,最后按“{”“}”分组——这是一种多么可怕的实现解析器的方式……足够接近了!但它没有将(1;1;2)(5;1;2)(5;1;1);1)分组。(x;y;z)是多边形顶部的坐标,因此我确实需要将它们分组:)@mhff32。好的。我将更改正则表达式。@mhff32。更改了Regexp。您可以尝试一下。+1,非常干净的尝试(特别是与答案中的代码相比)@Downvoter您可以发表评论,使您的downvote更有意义吗?
Matcher matcher1 = Pattern.compile("(?<=\\{).*?(?<=\\})").matcher(yourInput);
while(mather1.find())
{
    Matcher matcher2 = Pattern.compile("(?<=\\[).*?(?=\\])").matcher(matcher1.Group());
    while (matcher2.find()) 
    {
        Matcher matcher3 = Pattern.compile("(\\d+);(\\d+);(\\d+)").matcher(matcher2.Group());
    while (matcher3.find()) 
    {

        tp.add(new Point(Double.valueOf(matcher3.Group(1),Double.valueOf(matcher3.Group(2)),Double.valueOf(matcher3.Group(3))));
    }
       sf.add(new Surface((Point[]) tp.toArray()));  
    }
convShape.add(new Body((Surface[])sf.toArray()));   
}