我想从文件中拆分具有以下格式的数据: {[(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("\\(")
为什么不拆分?
答案 0 :(得分:1)
嗯,我认为这应该有效。就您当前的代码而言,它应该正确地拆分它。
但是,考虑到你只想在括号内加numbers
。你这里不需要split
。你正在努力工作。您最好使用Pattern
和Matcher
类来查找(
和)
之间的所有内容。您可以使用以下代码获得帮助: -
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
的{{1}} 3 integers
相对,;
位于brackets
内,groups
由{{comma(,)
隔开1}}。然后它捕获完整的匹配。
matcher.find()
- 查找符合上述模式的字符串中的所有内容。
matcher.group(0)
- 获取完整匹配。
拆分comma(,)
上的完整匹配以获得个人坐标
如果您希望匹配由double
分隔的integer
或;
值,则需要稍微更改Regex
。我留给你了。
有关各种quantifiers
的详细信息,请参阅Pattern class docs。上述正则表达式中的{3}
是量词之一。
答案 1 :(得分:0)
嗯,它闻起来像JSON,但如果你想使用split,那么
/[\\d;]+/
";"
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
测试此演示here。
答案 2 :(得分: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()));
}