我有一个像这样的YAML列表,需要用Java中的正则表达式解析它:
stacks:
- name: test1
folder: a
- name: test2
folder: b
最后我想迭代列表文本块。这意味着在创建Pattern实例后,我希望此文本的Matcher实例找到两个匹配项:
1
name: test1
folder: a
2
name: test2
folder: b
当忽略列表名称(上面的“堆栈”)时,我可以执行以下操作:
String regex = "^\\s++-(.*$\\n(?:^\\s++[^-].*$\\n)*)";
Pattern p = Pattern.compile( regex, Pattern.MULTILINE | Pattern.UNIX_LINES );
Matcher m = p.matcher( data );
使用此表达式生成的匹配器将找到我需要的两个匹配项。
但是,我实际上不想忽略列表名称,并且我想声明“在以下列表名称之后获取所有列表元素”(如方法调用getListData(yamlData, listName)
)。看来我需要一个积极的向后看。不幸的是,我还没有办法在获得两场比赛的同时做到这一点。你有什么想法吗?
(我知道有snakeyaml和其他库。不幸的是,我需要在这里使用正则表达式。)
编辑:我无法对列出的对象的元素顺序做出任何假设。解决方案必须能够处理名称和文件夹(以及可能的其他)交换。