给出一个wikiText字符串,例如:
{{ValueDescription
|key=highway
|value=secondary
|image=Image:Meyenburg-L134.jpg
|description=A highway linking large towns.
|onNode=no
|onWay=yes
|onArea=no
|combination=
* {{Tag|name}}
* {{Tag|ref}}
|implies=
* {{Tag|motorcar||yes}}
}}
我想在Java / Groovy中解析模板ValueDescription
和Tag
。
我尝试使用正则表达式/\{\{\s*Tag(.+)\}\}/
并且没问题(它会返回|name
|ref
和|motorcar||yes
),但是
/\{\{\s*ValueDescription(.+)\}\}/
不起作用(它应该返回上面的所有文字)。
预期输出
有没有办法在正则表达式中跳过嵌套模板?
理想情况下,我宁愿使用简单的 wikiText 2 xml 工具,但我找不到类似的东西。
谢谢! Mulone
答案 0 :(得分:3)
任意嵌套的标签将无效,因为它会产生语法non-regular。你需要能够处理无上下文语法的东西。 ANTLR是一个很好的选择。
答案 1 :(得分:2)
使用Pattern.DOTALL
选项创建正则表达式模式,如下所示:
Pattern p = Pattern.compile("\\{\\{\\s*ValueDescription(.+)\\}\\}", Pattern.DOTALL);
Pattern p=Pattern.compile("\\{\\{\\s*ValueDescription(.+)\\}\\}",Pattern.DOTALL);
Matcher m=p.matcher(str);
while (m.find())
System.out.println("Matched: [" + m.group(1) + ']');
Matched: [
|key=highway
|value=secondary
|image=Image:Meyenburg-L134.jpg
|description=A highway linking large towns.
|onNode=no
|onWay=yes
|onArea=no
|combination=
* {{Tag|name}}
* {{Tag|ref}}
|implies=
* {{Tag|motorcar||yes}}
]
假设关闭}}
显示在{{ValueDescription
的单独行中,以下模式将有效捕获多个ValueDescription
:
Pattern p = Pattern.compile("\\{\\{\\s*ValueDescription(.+?)\n\\}\\}", Pattern.DOTALL);