使用Java Regex将包含未知匹配数的字符串解析为List

时间:2018-06-05 23:34:52

标签: java regex

我基本上有逗号分隔列表的String表示。但是,每个单独的元素也以逗号分隔,因此修改了String以使每个元素都被'<'包围和'>'。我正在尝试使用正则表达式捕获每个元素并将其添加到列表中,从而使其成为元素列表,而不是列表的字符串。

以下是一些示例字符串输入:

"<>"         // should match regex, but will be thrown out
"<a=1>"
"<a=1,b=1>"
"<a=1,b=1>,<a=2,b=2>"
"<a=1,b=1>,<a=2,b=2>,<a=3,b=3,c=3>,<a=4>"

我想要的相应输出是这样的列表:

["a=1"]
["a=1,b=1"]
["a=1,b=1","a=2,b=2"]
["a=1,b=1","a=2,b=2","a=3,b=3,c=3","a=4"]

我尝试使用的模式是:

Pattern pattern = Pattern.compile("<([^>]*)>(,<([^>]*)>)*");

但是当我尝试创建列表时,它不会将每个附加事件作为新组处理。

Matcher matcher = pattern.matcher(myString);
if (matcher.matches()) {
    List<String> listOfElements = new ArrayList<>();
    for (int i = 1; i <= matcher.groupCount(); i++) { // group 0 represents the entire String, so start at index 1
        if (matcher.group(i) != null) {
            listOfElements.add(matcher.group(i));
        }
    }
    System.out.println(listOfElements);
}

上述测试用例的结果是:

["a=1"]
["a=1,b=1"]
["a=1,b=1", ",<a=2,b=2>", "a=2,b=2"]
["a=1,b=1", ",<a=4>", "a=4"]

注意:为了便于分离列表中的值,我在该结果中添加了引号 - 显然System.out.println()没有写出引号。

正确的正则表达式是什么?或者,如果有比使用正则表达式更好的方法,我会很高兴听到,但请记住,我宁愿不必使用第三方软件包。

2 个答案:

答案 0 :(得分:2)

将条目逐一与find匹配,而不是matches

Pattern pattern = Pattern.compile("<([^>]*)>");
Matcher matcher = pattern.matcher(myString);
List<String> listOfElements = new ArrayList<>();

while (matcher.find()) {
    listOfElements.add(matcher.group(1));
}
System.out.println(listOfElements);

答案 1 :(得分:1)

你可以通过使用环视分割来在一行中完成:

String[] parts = str.split("(?<=>),(?=<)");

正则表达式在前缀为>并后跟<的逗号上拆分,而不使用尖括号。

如果你真的需要一个清单:

List<String> parts = Arrays.asList(str.split("(?<=>),(?=<)"));