我不想编写一个解析器来返回原始(多维)数组
double[][] returned = parse2D(Arrays.deepToString(new double[][]{{1,2}{3,4}}));
同样,我想要 methodparse1D
和 method parse3D
,这将取决于其他解析器。
我在编码时遇到了几个问题。
Scanner
将给出诸如“[1”和“4]”之类的标记Scanner
usinguseDelimiter("[(\\s*,\\s*)]")
不会保留多维数组的结构- 我似乎无法找到一个
Pattern
让Matcher
捕获正确组的人 - 此外,我不应该为
double
.
下面的代码我吐出了(写的)一类作品,但也接受字符串,如"random crap before actual array [1]"
public static Tuple<Matcher, double[]> parse1D(String input) {
Pattern left = Pattern.compile("\\[");
Pattern right = Pattern.compile("\\]");
Pattern comma = Pattern.compile(",\\s*");
Pattern num = Pattern.compile("[[0-9]+E\\.\\-]+");
Matcher matcher = left.matcher(input);
matcher.find();
List<Double> l = new ArrayList<Double>();
matcher.usePattern(num);
while (matcher.find()) {
MatchResult result = matcher.toMatchResult();
l.add(Double.parseDouble(result.group()));
matcher.usePattern(comma);
matcher.find();
matcher.usePattern(num);
}
double[] ret = new double[l.size()];
int x = 0;
for (double d : l) {
ret[x] = d; x++;
}
return new Tuple<Matcher, double[]>(matcher, ret);
} // the matcher is also returned to be used by parse2D...
这应该很简单!为什么我不能让这个简单的事情起作用?!我应该自己写一个解析器吗?我应该得到一些解析器组合器库吗?该怎么办?