2009-07-22 8 views
1

しばらくの間、正規表現をやっていないし、少し錆びています。ネストされたタグの正規表現(Wikimediaのコンテンツ)

私はWikipediaのエントリからカテゴリを解析しようとしています。私が必要とするのは、2つの開いた括弧で始まり、2つの閉じ括弧で終わるパターンに含まれる個々の文字列です。

このクエリでは、ほとんどの時間の作品 -

(\[\[)(?<category>.*[^\]#])([\]]) 

が、決算ブラケットがそれらの隣にコンマ(「」)がある場合の問題を持っています。

これは、次のテキスト解析するという残念な結果がある -

nlocation = [[Seattle, Washington]], [[United States|USA]]| 

それは「カテゴリ」明らかに

Seattle, Washington]], [[United States|USA 

ために、以下の抽出物を、コンマはこれをオフに投げているし、それが発見されます次のセット。開いている括弧と閉じた括弧の間のすべての値を取得する最も良い方法は何ですか?

+0

htmlを解析するときは、それぞれの言語のhtmlパーサーを使用してください。 xmlのいくつかの明白な利点の1つは、それらを解析するために正規表現を使用する必要がないということです。 –

+2

@ THC4k - あなたについてはわかりませんが、HTMLは[[シアトル、ワシントン]それはのように見えるSeattle, Washington

答えて

2

疑問符を付加することにより、あなたのワイルドカードは、非貪欲ください:それは個々のカテゴリに一致するようになります

(\[\[)(?<category>.*?[^\]#])([\]]) 

        ^
        Here is the edit 

を。

+0

私は決して非貪欲な一致のファンではなかった - 私は通常私が私の試合に欲しくないものを指定することを好む - しかし、簡単に修正する+1。 –

+0

非貪欲な量指定子は、正規表現の銀色の箇条書きです。誰かが正規表現の質問をし、他の誰かが嫌な量詞を使うように指示します。それはうまくいきます。誰もが幸せです。そして、彼らのどちらも、なぜ*それが働いたのか、何らかのアイディアを持っていません –

3

問題はコンマではなく、問題は.*が "[]" [["他のものと同様に一致する]ということです。 *グレーディーです - 可能な限り一致します。これを修正するには、貪欲でないバージョン(RichieHindleのように)を使用するか、.*[^\]]*に変更することができます。欲張りの文字はとなります。を除く。それはまた、トリックを行う必要があります。

また、これらは「ネスト」タグではありません。つまり、[[tag [[inside]] tag]]です。それはウィキメディアのマークアップでは意味がないと思うので、おそらくあなたが望むものではありません。

0

私はあなたがこれを必要以上に複雑にしていると思います。これはあなたが望むことをしますか?

\[\[(?<category>[^\[\]]+)\]\] 
0

コンマはまったく関係ありません。あなたは簡単なテストであなた自身を確認できました。

ここにはネストはありません。とにかくWikilinksは入れ子にすることはできません。

あなたの内側のパターンがwikilinkを閉じるダブルブラケットと一致しないようにする必要があります。そうすれば、いつでもに二重括弧のシーケンスが遭遇すると、正規表現のマッチにさらに多くの文字が蓄積されなくなります。あなたの正規表現の問題は、.*すべてと一致することです。修正する簡単な方法はuse a non-greedy modifierです。そうすれば、できるだけ早くマッチが終了します。あなたがそれをしたくない場合や、正規表現ライブラリがそれをサポートしていない場合は、パターンを終了するシーケンスを明示的に除外する必要があります。

単純なアプローチでは、単に閉じ括弧をすべて除外することです:[^]]*。しかし、十分ではありません。 A シングル閉じ括弧は、ウィキリンクのテキストに許可されているです。したがって、二重かっこを除外して1つの括弧を受け入れる必要があります。これはそれを行う必要があります。しかし、クロージングシーケンスを破るために非ブラケットが続いています場合にのみ、右のブラケットを受け入れる

\[\[  # 2 opening brackets 
(?<category> 
    (
    ]?  # optional bracket 
    [^]] # always a non-bracket 
)* 
) 
]]   # 2 closing brackets 

関連する問題