用Java中的正则表达式解析wikiText

时间:2011-06-03 13:27:40

标签: java regex mediawiki wikitext

给出一个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中解析模板ValueDescriptionTag。 我尝试使用正则表达式/\{\{\s*Tag(.+)\}\}/并且没问题(它会返回|name |ref|motorcar||yes),但是 /\{\{\s*ValueDescription(.+)\}\}/不起作用(它应该返回上面的所有文字)。

预期输出

有没有办法在正则表达式中跳过嵌套模板?

理想情况下,我宁愿使用简单的 wikiText 2 xml 工具,但我找不到类似的东西。

谢谢! Mulone

2 个答案:

答案 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);