我有一个字符串,我想解析成一个数组。
给定的字符串格式为P[AB, AC, AD] (A1, A2, A3)
。
我想将它存储在这样的数组中,以便第一个(
之后的所有数据都将被正则表达式条件过滤:
P[AB, AC, AD]
A1
A2
A3
这就是我提出的:
String regex = "/^(([,()]+)$";
String[] numbers = stringIn.split(regex);
我的问题是它根本不起作用,因为正则表达式不会过滤掉碎片,所有内容都存储在numbers[0]
。
答案 0 :(得分:1)
我认为这就是你想要的:
String regex = "[ ,()]+(?=[^\\]]*$)";
String stringIn = "P[AB, AC, AD] (A1, A2, A3)";
String[] numbers = stringIn.split(regex);
for (String n : numbers)
{
System.out.println(n);
}
输出:
P[AB, AC, AD]
A1
A2
A3
[ ,()]+
部分尝试匹配空格,逗号和括号,无论它们出现在哪里,但(?=[^\\]]*$)
(肯定lookahead)会在]
之前过滤掉任何匹配项。我假设字符串中只有一组方括号。
答案 1 :(得分:0)
你需要从字面上转义你想要匹配的括号,并且你不需要在主体周围使用反斜杠,你可能想要匹配而不是分裂。
Pattern regex = Pattern.compile("\\(([^)]+)");
Matcher m = regex.matcher(stringIn);
if (m.find()) {
String[] numbers = m.group(1).split("[,\\s]+");
}
最后,与JavaScript和C#以及Python不同,Java中的$
与输入的结尾不匹配。您需要使用\\z
代替。如果输入结尾有换行符,则Java中的$
会在输入结束时或最后一次换行符之前匹配。
答案 2 :(得分:0)
想到一个不太优雅,但可能更容易遵循的方式:
// Split the string into two parts.
// parts[0] == "P[AB, AC, AD]"
// parts[1] == "A1, A2, A3"
String[] parts = stringIn.split(" *\\(|\\)");
// Split the second part into its components.
String[] secondParts = stringInParts[1].split(", *");
// Combine the results.
String[] numbers = new String[secondParts.length + 1];
numbers[0] = parts[0];
System.arrayCopy(secondParts, 0, numbers, 1, secondParts.length);