在某些字符后应用正则表达式条件

时间:2011-05-08 00:03:02

标签: java regex

我有一个字符串,我想解析成一个数组。 给定的字符串格式为P[AB, AC, AD] (A1, A2, A3)。 我想将它存储在这样的数组中,以便第一个(之后的所有数据都将被正则表达式条件过滤:

P[AB, AC, AD]  
A1  
A2  
A3 

这就是我提出的:

String regex = "/^(([,()]+)$";  
String[] numbers = stringIn.split(regex);

我的问题是它根本不起作用,因为正则表达式不会过滤掉碎片,所有内容都存储在numbers[0]

3 个答案:

答案 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);