Java –正则表达式–匹配开始和结束的卷曲标签

user2868900:

我想捕获这样的文本:

{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中是否有嵌套标签-然后将它们放入数组中。

因此,修改代码是这样的:

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\})?(obv在这里不是java格式的),但是它并没有停止在大括号处{/group1},而是继续捕获所有内容。

对于这些更复杂的正则表达式模式,我是陌生的,因此,如果有人可以在这里为我提供帮助,将不胜感激–感觉就像我快要解决这一问题了。

这是显示我的问题的正则表达式101

阿努巴瓦:

您不远处,可以使用此正则表达式:

(?s)\{(\w+)}(.*?)\{/\1}

更新了RegEx演示

在Java中使用:

final String regex = "(?s)\\{(\\w+)\\}(.*?)\\{/\\1\\}";

正则表达式详细信息:

  • (?s):结束DOTALL模式
  • \{(\w+)}: Match opening tag as{tag}`并在捕获组#1中捕获标记名称
  • (.*?):再匹配0个字符(非贪婪)并将其捕获在第2组
  • \{/\1}{/tag}通过使用组#1的反向引用来匹配结束标记

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章