Java正则表达式如何找到父匹配?

时间:2015-08-18 08:27:43

标签: java regex string match wikipedia

来自Wikipedia的任何页面:

...
abas asdn asf asfs af
{{Template1
|a = Name surname
|b = jhsdf sdf
|c = {{Template2}}
|d = 
|e = [[f]] and [[g]]
|h = asd asdasfgasgasg asgas jygh trdx dftf xcth
|i = 73
|j = {{Template2|abc|123}}
|j = {{Template3|aa=kkk|bb={{Template4|cc=uu}}}}
}}

asd wetd gdsgwew g

{{OtherTemplate
|sdf = 213
}}
...

如何使用Java正则表达式找到Template1的内容(起始|a结尾为}})?

我试过了:

String pattern = "\\{\\{\\s*Template1\\s*(.*?)\\}\\}";

Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
Matcher m = p.matcher(content);

while (m.find()) {
    if (!m.group().equals("")) {
        System.out.println(m.group());
        System.out.println("-----------------------");
    }
}

但是在这里正则表达式找到第一个}}Template2 }})然后停止。
我希望通过}}任何{{是开放的。然后我想找到顶级父母比赛。

我希望在Template1{{之间获得最高}}个内容?

修改

请注意,我在删除空格后正在解析content

content.replaceAll("\\s+","");  

将内容想象成一行。

3 个答案:

答案 0 :(得分:1)

/^{{Template1(.*?)^}}/sm

返回:

|a = Name surname
|b = jhsdf sdf
|c = {{Template2}}
|d = 
|e = [[f]] and [[g]]
|h = asd asdasfgasgasg asgas jygh trdx dftf xcth
|i = 73
|j = {{Template2|abc|123}}
|j = {{Template3|aa=kkk|bb={{Template4|cc=uu}}}}

https://regex101.com/r/qC6cM1/1(DEMO)

答案 1 :(得分:0)

\n

只需加入{{1}}。请参阅演示。

https://regex101.com/r/uF4oY4/72

答案 2 :(得分:0)

我认为解析器在这种情况下可以做得更好,但如果你想要正则表达式,那么这个怎么样:

{{Template1(?:[^{}]*?(?:{{[^}]+?}}))+(?:[}\n\s]+})*

DEMO

我认为你的输入就像单行一样。