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}}
    }}

ValueDescriptionテンプレートをTagJava/Groovy で解析したいと思います。私は正規表現で試してみましたが、/\{\{\s*Tag(.+)\}\}/うまくいきます(|name |refand を返します|motorcar||yes)が、 /\{\{\s*ValueDescription(.+)\}\}/機能しません(上記のすべてのテキストを返す必要があります)。

期待される出力

正規表現でネストされたテンプレートをスキップする方法はありますか?

理想的には単純なwikiText 2 xmlツールを使用したいのですが、そのようなツールは見つかりませんでした。

ありがとう!ムロン

4

2 に答える 2

4

文法がnon-regularになるため、任意にネストされたタグは機能しません。文脈自由文法を扱えるものが必要です。 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 に答える