给定一个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/Govy中解析模板ValueDescription
和Tag
。我尝试使用regex /{{s*Tag(.+)}}/
,它很好(它返回|name
、|ref
和|motorcar||yes
),但是/{{s*ValueDescription(.+)}}/
不起作用(它应该返回上面的所有文本)。
预期输出
有没有办法跳过正则表达式中的嵌套模板?
理想情况下,我宁愿使用一个简单的wikiText 2 xml工具,但我找不到类似的工具。
谢谢!Mulone
任意嵌套的标记不起作用,因为这会使语法变得不规则。你需要一些能够处理上下文无关语法的东西。ANTLR是一个不错的选择。
使用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);