0

次の形式のファイルからデータを分割したい:{[(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()));   
    }
}

なぜ分割s.split("\\[")s.split("\\(")ないのですか?

4

3 に答える 3

1

まあ、それはうまくいくはずだと思います。現在のコードに関する限り、正しく分割する必要があります。

ただし、numbers角かっこの内側が必要な場合に限ります。ここは必要ありませんsplit。あなたは仕事を大変にしています。との間のすべてを見つけるにはPatternMatcherクラスを使用する方がよいでしょう。あなたはあなたの助けのために以下のコードを使うことができます:-()

    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)

説明:-

  • (\\(\\d;\\d;\\d\\),?){3}-これは、内側で区切られ、で区切られているの一致3 groupsです。次に、完全一致をキャプチャします。3 integers;bracketsgroupscomma(,)

  • matcher.find()-上記のパターンに一致する文字列からすべてを検索します。

  • matcher.group(0)-完全一致を取得します。

  • 完全一致を分割しcomma(,)て、個々の座標を取得します

  • 一致doubleまたはinteger値を。で区切って指定する場合は、少し;変更する必要があります。Regex私があなたに任せること。

  • さまざまなの詳細については、Patternクラスのドキュメントを参照してくださいquantifiers{3}上記の正規表現は数量詞の1つです。

于 2012-10-29T12:52:41.827 に答える
0

さて、それはJSONのようなにおいがしますが、splitを使用したい場合は、

  • グループにすべての一致を検索させるには/[\\d;]+/
  • グループから数値を取得するには、splitを使用して";"

デモ:

import java.util.*;
import java.lang.*;
import java.util.regex.*;

class Main
{
  public static void main (String[] args) throws java.lang.Exception
  {
    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;]+");
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        System.out.println(matcher.group(0));
        String[] numbers = matcher.group(0).split(";");
        int i = 1;
        for (String number: numbers) {
            System.out.println("Parameter #" + i + ": " + number);
            i++;
        }
        System.out.println();
    }   
  }
}

出力:

1;1;2
Parameter #1: 1
Parameter #2: 1
Parameter #3: 2

5;1;2
Parameter #1: 5
Parameter #2: 1
Parameter #3: 2

5;1;1
Parameter #1: 5
Parameter #2: 1
Parameter #3: 1

1;3;2
Parameter #1: 1
Parameter #2: 3
Parameter #3: 2

5;3;2
Parameter #1: 5
Parameter #2: 3
Parameter #3: 2

5;1;2
Parameter #1: 5
Parameter #2: 1
Parameter #3: 2

ここでこのデモをテストします。

于 2012-10-29T12:52:15.553 に答える
0

より良い方法は、グループ内の必要なデータを一致させることです

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()));   
}
于 2012-10-29T12:55:34.213 に答える