我要捕获这样的文本:
{ul}
{li}Item 1{/li}
{li}Item 2{/li}
{li}Item 3{/li}
{/ul}
{img}this_is_an_image{/img}
{p}paragraph text {/p} {h2}Heading{/h2}
将其转换为哈希图的ArrayList,如下所示:
[
{ "ul" : ["Item 1", "Item 2", "Item 3"] },
{"img" : "this_is_an_image"},
{"p" : "paragraph text"},
{"h2" : "Heading"}
]
当前,我有一个while循环,可以从字符串中获取“基本”级别的项目(即非嵌套项目)。
ArrayList<Object> list = new ArrayList<>();
Pattern pattern = Pattern.compile("\\{(\\w+)}(?:\\()?([^\\{\\)]+)(?:\\{\\/\1})?");
Matcher matches = pattern.matcher(s);
while (matches.find()) {
Map<String, String> match = new HashMap<>();
match.put(matches.group(1), matches.group(2));
list.add(match);
}
return list;
我想对此进行修改,使其能够匹配第一个捕获组-捕获开始和结束标签之间的所有内容,然后检查捕获组2中是否有嵌套标签-然后将它们放入数组中。 / p>
因此要修改代码,如下所示:
ArrayList<Object> list = new ArrayList<>();
Pattern pattern = Pattern.compile("New pattern");
Matcher matches = pattern.matcher(s);
while (matches.find()) {
Map<String, Object> match = new HashMap<>();
Pattern patt = Pattern.compile("only capture text within brackets pattern")
Matcher nestedMatches = patt.matcher(matches.group(2))
ArrayList<String> sublist = new ArrayList<>();
while(nestedMatches.find()) {
sublist.add(nestedMatches.group(2))
}
if (list.size() > 0) {
match.put(matches.group(1), sublist);
} else {
match.put(matches.group(1), matches.group(2));
}
list.add(match);
}
return list;
我创建了以下正则表达式:\{(\w+)\}(.*)(?:\{\1\})?
(此处未设置java的obv格式),但它并不止于右花括号{/group1}
,而是继续捕获所有内容。
对于这些更复杂的正则表达式模式,我是陌生的,因此,如果有人可以在这里帮助我,将不胜感激–感觉就像我即将解决这个问题。
这是Regex 101,显示我的问题
答案 0 :(得分:3)
您不远处,可以使用此正则表达式:
(?s)\{(\w+)}(.*?)\{/\1}
在Java中使用:
final String regex = "(?s)\\{(\\w+)\\}(.*?)\\{/\\1\\}";
RegEx详细信息:
(?s)
:结束DOTALL
模式\{(\w+)}: Match opening tag as
{tag}`和捕获组#1中的捕获标签名称(.*?)
:再匹配0个字符(非贪婪字符)并将其捕获在#2组中\{/\1}
:使用#1组的反向引用将结束标记匹配为{/tag}