3

给定一个 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/GroovyValueDescription中解析模板。Tag我尝试使用正则表达式/\{\{\s*Tag(.+)\}\}/,它很好(它返回|name |refand |motorcar||yes),但 /\{\{\s*ValueDescription(.+)\}\}/不起作用(它应该返回上面的所有文本)。

预期输出

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

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

谢谢!穆龙

4

2 回答 2

4

任意嵌套的标签将不起作用,因为这会使语法变得不规则。您需要能够处理上下文无关语法的东西。 ANTLR是一个不错的选择。

于 2011-06-03T13:31:45.850 回答
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);
于 2011-06-03T14:29:44.830 回答