我本质上是用逗号分隔的列表的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()不会写出引号。

什么是合适的正则表达式来做到这一点?或者,如果有比使用正则表达式更好的方法,我很高兴听到,尽管要记住,我宁愿不必使用第三方程序包。

最佳答案

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

07-28 00:59
查看更多