自Java doesn't have an eval()
module以来,我想编写自己的正则表达式来将字符串解析为double[][]
,例如。
[in]:
`{{1.23,8.4},{92.12,-0.57212}}`
`{{1.23,-8.4}, {-92.12,-0.57212}}`
[代码]:
double[][] xArr;
// Somehow read the string into something like this:
xArr = new double[][] {{1.23,8.4},{92.12,-0.57212}};
System.out.println(xArr[0][0] + " " + xArr[0][1]);
[OUT]:
1.23 -8.4
目前,我这样做:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.List;
public class HelloWorld {
public static void main(String[] args) {
String s = "{{1.23,8.4}, {92.12,-0.57212}}";
Pattern regex = Pattern.compile("((-)?\\d+(?:\\.\\d+)?)");
Matcher matcher = regex.matcher(s);
List<double[]> locations = new ArrayList<double[]>();
int i = 0;
while(matcher.find()){
double d1 = Double.parseDouble(matcher.group(1));
matcher.find();
double d2 = Double.parseDouble(matcher.group(1));
locations.add(new double[] {d1, d2});
i++;
};
}
}
有更好的方法吗?即:
现在,通过知道double [] []的内部大小为2并且在迭代match.find()
期间,代码有点作弊。它通过2次跳转到下一对,是否有办法更改正则表达式,以便一次提取2个组?
目前,在创建新的d1
并添加到d2
之前,它正在阅读double[]
和List
变量,是有没有办法直接创建d1
和d2
?
答案 0 :(得分:6)
使用jackson但你必须用方框/括号替换大括号。
使用此功能,您无需指定预期数组的尺寸
public static void main(String[] args) throws IOException {
String jsonString = "{{1.23,8.4}, {92.12,-0.57212}}";
jsonString = jsonString.replace("{", "[").replace("}", "]");
Double[][] doubles = new ObjectMapper().readValue(jsonString, Double[][].class);
System.out.println(Arrays.deepToString(doubles));
}
答案 1 :(得分:4)
这是我提出的Java 8解决方案:
args.map(entry => s""""${entry}"""" ).mkString(",")
输出:
String test = "{{1.23,8.4},{92.12,-0.57212}}";
double[][] vals = Arrays.stream(test.replaceAll(" ", "").split("},\\{"))
.map(str -> str.replaceAll("[{}]", "").split(","))
.map(Arrays::stream)
.map(stream -> stream.mapToDouble(Double::parseDouble)
.toArray())
.toArray(double[][]::new);
System.out.println(Arrays.deepToString(vals));
或者如果你想要[[1.23, 8.4], [92.12, -0.57212]]
:
Double[][]
说明:
首先删除任何空格,并在模式Double[][] vals = Arrays.stream(test.replaceAll(" ", "").split("},\\{"))
.map(str -> str.replaceAll("[{}]", "").split(","))
.map(Arrays::stream)
.map(stream -> stream.map(Double::parseDouble)
.toArray(Double[]::new))
.toArray(Double[][]::new);
上拆分字符串,这将产生},\\{
,其中每个String[]
都是String
之一多余的花括号:
double[]
然后,对于每个["{{1.23,8.4", "92.12,-0.57212}}"]
,删除花括号,然后再次分割String
。因此,每个String
变为String
,其中每个值都是&{34; String[]
&#34; {/ p>的String
表示形式
double
然后将这些字符串解析为双精度数据,并将所有内容收集到[["1.23", "8.4"],["92.12", "-0.57212"]]
然后收集到double[]
:
double[][]
答案 2 :(得分:0)
有没有办法改变正则表达式,使其一次提取2个组
是。您可以使用现有模式从一个模式中提取整行。您必须添加paranthesis和komma以及+运算符(对于多个值)。 如果只有一行,则可以使用当前模式提取值,直到找不到(使用while循环)。
有没有办法在不创建d1和d2的情况下直接进行?
我不确切地知道你的意思。创建它们的问题在哪里?使用问题1中建议的方法,您可以将每个值直接存储在列表中,然后从中创建一个数组。
如果您的格式不改变,我也喜欢Olayinka的解决方案。