关于嵌套结构的正则表达式

时间:2017-06-27 19:52:37

标签: java regex

输入为:

#start
  random string 1
#end

#start
  random string 2
#end

我可以写一个正则表达式

(#start[\s\S]*?#end)

现在这个给定的数据有点复杂:

  #start
    random string 1
    #start
      random string 2
    #end
  #end

  #start
    random string 3
  #end

我希望得到03场比赛,其中包括:

#start
  random string 1
#end

#start
  random string 2
#end

#start
  random string 3
#end

这是否可以使用正则表达式?因为我尝试了大多数正则表达式规则,但我认为我错过了一些因为它不能按我的意愿工作。

有人可以告诉我我可以用哪些规则来实现这个目标吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

单独使用正则表达式无法做到这一点。 Can regular expressions be used to match nested patterns 的答案解释了为什么会出现这种情况的详细信息。您必须在正则表达式中编码最大可能深度才能使其正常工作。

答案 1 :(得分:2)

你不能在一个正则表达式中完成它。但是,您可以通过一次提取一个组并从循环中的输入字符串中删除它来实现它,直到找不到更多匹配项。

因此正则表达式在java

中可能如下所示
sudo pip2 install google-api-python-client==1.5.3

现在你可以从初始行中删除字符串部分并在循环中执行。

这是一个小型的测试程序:

Pattern p = Pattern.compile("^.*(#start[^#]+#end).*$");

结果是:

public static void main(String args[]) {
    String re = "#start hello there #start my world #end #end #start bye dear #end ";
    Pattern p = Pattern.compile("^(.*)(#start[^#]+#end)(.*)$");
    Matcher m;
    while ( (m = p.matcher(re)).matches()) {            
        System.out.println(m.group(2));
        re = m.group(1) + m.group(3);
    }
}

答案 2 :(得分:0)

我从Serge的回答中得到了解决方案。答案很好,但由于深层次未知,不适合我的情况。所以我的解决方案找到最深的匹配组,从字符串中删除它们,然后继续该字符串。

所以喜欢(#start((?!#start)[\ s \ S])*?#end)