2011-11-15 3 views
2

私はPHPBBの投稿用にデータベースから取得したテキストからBBCodesを解析するためにC#クラスに取り組んでいます。 PHPBBオン BBコードは次のようになりますが追加のカスタムがあります:データベースに座って、C#Regexで複数行のBBCodeを解析する

[deck={TEXT1}]{TEXT2}[/deck] 

、次のようになります。

[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne] 

私は正規表現を使用していることを置き換えるためにしようとしていますが、 C#で。 私のC#が次のようになります。

string text = "[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]"; 
string replace = "my replacement string"; 
string pattern = @"\[deck=((.|\n)*?)(?:\s*)\]((.|\n)*?)\[/deck(?:\s*)\]"; 
RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline; 
Regex regex = new Regex(pattern, options); 
string result = regex.Replace(text, replace); 

私はそれをすべてがちょうど私の正規表現パターンが間違っているにダウンしていますかなり確信しています。 Regexは私の強い訴訟ではないので、私にとっては驚きではありません。

ありがとうございます。どんな助けでも大歓迎です。

編集:一部の人が不明な点を見つけたので、私はもっと大きな例を追加します。

ソーステキスト:

[deck=Bant:13giljne]Item #1 
Item #2 
Item #3 
Item #4[/deck:13giljne] 

望ましい結果:

<span>Bant</span> 
<div>Item #1 
Item #2 
Item #3 
Item #4</div> 

うまくいけば、これは私が何をしようとしているの鮮明な画像を提供します。

+0

何で何を交換しようとすると、「私はC#で正規表現を使用していることを置き換えるしようとしていますか」? – m0skit0

+0

@ m0skit0私は正規表現に "text"という変数の文字列をマッチさせ、 "replace"という変数の文字列で置き換えようとしています。 – Wayne

+0

しかし、全体の文字列ではないですか? * text *の代わりに* replace *を使うだけではどうですか?私はあなたの問題を理解していません... – m0skit0

答えて

2

あなたの正規表現は、 "最初のテキスト"と "大多数のテキスト"と一致する必要があることを示していると思います。

\[deck=([^\:]+?):(?:[^\]]+)\]([^\[]+?)\[/deck:(?:[^\]]+)\] 

これはあなたのご利用に非常に近いものです。

+0

これは完全に動作しています、ありがとうございます! – Wayne

+1

あなたはバグがあると思います。 '([^ \]] +?)'を '' [複数行のテキスト]にマッチさせたい部分の '([^ \ [] +?)'に置き換えます。次のカッコではなく、次のカッコに至るまですべてを探しています。 –

+0

@Jim良いキャッチ。 – Wayne

-1

"[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]"を置き換える場合は、regexを使用しないでください。置換を使用します。

string result= text.Replace("[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]", replace); 

正規表現は、文字列が完全には分かっていないが、その構造がわかっている場合に通常使用されます。

+0

それは役に立たないでしょう。 "FirstText"は静的な値ではなく、 ":13giljne"は静的な値ではなく、 "Large Multiline Text"は静的な値ではありません。これらはすべて私がコントロールできない値です。それは、私が照合する必要のあるデータベースから出てくるかもしれない何かの一例に過ぎません。 – Wayne

+2

@ m0skit0、um、私は、OPが求めていることの精神をかなり理解しているとは思わない。 –

+0

ウェインは、特に最初の質問で、かなり良い仕事をしたと思います。 – jwiscarson

1

正規表現を初めてお使いの場合は、少しずつマッチングを試みて、文字列が一致することを確認してください。

string firstPart = "\[deck=[^\]]+\]"; 

[^\]]+は、「]文字ではないすべてのものと一致する」と言う:

string text = "[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]"; 

は、最初の部分と一致する式を書く:たとえば、文字列を与えられました。

は、それが一致していることを確認します。

Match m = Regex.Match(text, firstPart); 

そして、第二部にタック:

string firstAndSecond = firstPart + "[^\[]*"; 

をそして、それをテストします。

それが働いていたら、最後の部分を追加することができます。

string search = firstAndSecond + "\[/deck[^\]]\]"; 

最終正規表現は(\[deck=[^\]]+\])([^\[]+)(\[/deck[^\]]+\]だろう。

個々の部分をグループ分けして見やすくしました。必要に応じてグループを削除したり、グループ化しないようにすることができます。

編集:私はあなたのあなたがFirstTextをキャプチャしたい、編集、および三つのグループから見

string replace = "<span>$2</span>\n<div>$3</div>"; 

string search = "(\[deck=([^:]+):[^\]]+\])([^\[]+)(\[/deck[^\]]+\]"; 

置換文字列、そして、のようなものになるだろう

+0

私は '[deck ='と ':13giljne]'の間にあるものを使う必要があるので、 '[deck = FirstText:13giljne]'と最初の部分を別々にマッチさせる必要があります。 – Wayne

+0

@Wayne:私の編集を参照してください。 –

+0

あなたの最終正規表現はまだ文字列と一致しませんでした。しかし、助けてくれてありがとう。 – Wayne

0

GitHubまたはNugetのSTML Parserを確認してください。 RegExは使用しませんが、はるかに効率的で高速です。あなたが...もう少し手の込んだことができれば

enter image description here

関連する問題