Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java–;Regex–;匹配开始和结束卷曲标记_Java_Arrays_Regex_Hashmap - Fatal编程技术网

Java–;Regex–;匹配开始和结束卷曲标记

Java–;Regex–;匹配开始和结束卷曲标记,java,arrays,regex,hashmap,Java,Arrays,Regex,Hashmap,我想捕获这样的文本: {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} 并将其转换为哈希映射的数组列表,如下所示: [ { "ul" : ["Item 1", "Item 2", "Item 3"] }, {"img" : "this_is_an_image"}

我想捕获这样的文本:

{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}
并将其转换为哈希映射的数组列表,如下所示:

[
  { "ul" : ["Item 1", "Item 2", "Item 3"] },
  {"img" : "this_is_an_image"}, 
  {"p" : "paragraph text"}, 
  {"h2" : "Heading"}
]
目前,我有一个while循环,它能够从字符串中获取“基本”级别的项(即非嵌套项)

ArrayList list=new ArrayList();
Pattern Pattern=Pattern.compile(“\\{(\\w+)}(?:\\()?([^\\{\\)]+)(?:\\{\\/\1}”);
匹配器匹配=模式匹配器;
while(匹配.find()){
映射匹配=新的HashMap();
match.put(matches.group(1),matches.group(2));
列表。添加(匹配);
}
退货清单;
我想对其进行修改,以便能够匹配第一个捕获组–捕获开始标记和结束标记之间的所有内容,然后检查捕获组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;
ArrayList list=new ArrayList();
Pattern=Pattern.compile(“新模式”);
匹配器匹配=模式匹配器;
while(匹配.find()){
映射匹配=新的HashMap();
Pattern patt=Pattern.compile(“仅捕获括号内的文本模式”)
Matcher nestedMatches=patt.Matcher(matches.group(2))
ArrayList子列表=新的ArrayList();
while(nestedMatches.find()){
添加子列表(嵌套匹配组(2))
}
如果(list.size()>0){
match.put(matches.group(1),子列表);
}否则{
match.put(matches.group(1),matches.group(2));
}
列表。添加(匹配);
}
退货清单;
我已经创建了这个正则表达式:
\{(\w+)\}(.*)(?:\{\1\})
(这里的obv不是java格式的),但它并没有在结束的大括号
{/group1}
处停止,而是继续捕获所有内容

我不熟悉这些更复杂的正则表达式模式,所以如果有人能在这里帮助我,我将不胜感激——感觉我即将解决这个问题


下面是一个显示我的问题的示例

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

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

在Java使用中:

final String regex = "(?s)\\{(\\w+)\\}(.*?)\\{/\\1\\}";
正则表达式详细信息:

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

您可以使用:
(?s)\{(\w+)}(.*?\{/\1}
刚刚尝试过–使用上面的代码作为“初始”正则表达式,然后线程中的原始正则表达式作为辅助匹配器。感谢您的帮助!
final String regex = "(?s)\\{(\\w+)\\}(.*?)\\{/\\1\\}";