我基本上有逗号分隔列表的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()没有写出引号。
正确的正则表达式是什么?或者,如果有比使用正则表达式更好的方法,我会很高兴听到,但请记住,我宁愿不必使用第三方软件包。
答案 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("(?<=>),(?=<)"));