2009-07-28 7 views
1

私はウィキペディアの記事を解析しようとしています。 * page-articles.xmlファイルを使用して、記事をすべてウィキコード形式でバックアップします。書式を取り除いて生のテキストを取得するには、正規表現を使用しようとしますが、あまり慣れていません。私はプログラミング言語としてC#を使用しています。 正規表現のデザイナーであるExpressoとちょっと試しましたが、私は知恵の最後です。ここで私が達成したいものです。C#でWikicodeを解析するための正規表現

テキストは以下の構造を含めることができます [[TextN]]または [[テキスト1] | TextN]]または [[テキスト1] |テキスト2 | ... | TextN]]

[[....]]パターンもTexti内に表示されます。エスプレッソはこの1つを実行して、無限ループに思わ

\[\[ (.* \|?)* \]\] 

:私は、私は、次の正規表現を試みたテキストwithhin構造をidentifingについてTextN

でこれらの構造を交換したいです。相対的な小さなテキストのための5分後、私はテストランをキャンセルしました。

その後、私は私が括弧の間に何かをキャプチャしたい、よりシンプルなものを試してみました:

\[\[ .* \]\] 

が、私のような行がある場合:

[[Word1]] text inbetween [[Word2]] 

を式が行全体を返し、ありません

[WORD1]

[WORD2]

ここで問題を解決するためのRegex-Expertsのヒントを教えてください。事前に

おかげで、 フランク

答えて

3

\[\[(.*?\]\]となります。

キーは。*ですか?これは文字を得ることを意味しますが、可能な限り少数です。一つのアプローチは次のようになり、ネストされたタグについて

EDIT

\[\[(?<text>(?>\[\[(?<Level>)|\]\](?<-Level>)|(?! \[\[ | \]\]).)+(?(Level)(?!)))\]\] 

これは[[と]同様にテキストを横切って一致することを確実にします。

+0

ネストしたタグでは失敗します:[[これは[[ネストされたタグ]]]] –

+0

SealedSunが指摘するように、ネストされたタグを扱うことができるRegExが必要です。 – Aaginor

+0

どのようにネストされたタグを処理したいですか?ネストされたタグで何をしたいですか?扱いは別にするか、入れ子にされた大括弧を削除するだけですか? – Lazarus

1

正規表現は常に可能で、最長一致を検索しようとするためです。あなたは.*

これは、値が文字で始まる場合、それはチェック手紙、|記号と二重括弧内の数字+のみと一致します

\[\[([A-Za-z][A-Za-z\d+]*)(\|\1)*\]\] 

を使用してみてくださいを変更する必要があります。

+0

aaginorはタグがネストされることを期待しているので動作しません。[[Tag1 | [[Tag2]] | Tag3]] –

+0

SealedSunが指摘するように、ネストされたタグを扱うことができるen RegExが必要です。 – Aaginor

+0

Regexは入れ子/再帰をうまく処理しません。 –

0

Expressoがうまくいかない場合は、RegexBuddyを試してみてください。

無料ではありませんが、正規表現がサンプルテキストのセクションとどのように一致するかを確認できる優れたリアルタイムテスト環境を提供します。

5

正規表現は使用しません(再帰/ネスティングはうまく処理できないため)。

代わりに、のテキストを手で入力してください。 *これは特に難しくありません。

要素

  • 平文チャンク、又は
  • タグ

のいずれかであるのに対し、あなたは要素のストリームとしてテキストを表すことができタグが含まれている可能性があります複数のエレメントストリーム|で区切られています。

elementStream ::= element* 
element ::= chunk | tag 
chunk ::= TEXT 
tag ::= "[[" elementStream otherStreams "]]" 
otherStreams ::= "|" elementStream otherStreams 

パーサーは、それぞれの定義をメソッドで表すことができます。だからelementStreamメソッドは、elementというテキストがあり、次の2文字は "]]"または "|"でない限り、呼び出すことになります。 (あなたがタグの中にいる場合)。 elementを呼び出すたびに、解析された要素(チャンクまたはタグ)が返されます。

これは本質的に再帰的降下パーサです。 ウィキペディア:GPL2はあなたのための問題ではない場合http://en.wikipedia.org/wiki/Recursive_descent_parser(記事は残念ながら、複雑な/かなり長いです)

+0

ヤップ、私は手でpasingは1つだと思います。私はあなたがまだ示唆している方法を本当に理解していませんが、脳細胞を1つまたは2つ使うだけです。 – Aaginor

+0

私は答えに追加したWikipediaのページを見てみたいかもしれません。 –

0

、多分あなたはScrewturn Wikiのソースコードをチェックアウトし、専門家がそれをしない方法を見ることができました。 C#で、

+0

私はコードを垣間見ました。彼はRegexを使いますが、彼はネストされたタグを扱っていません。 – Aaginor

関連する問題