2009-09-03 27 views
1
(\[(c|C)=)(#?([a-fA-F0-9]{1,2}){3})\](.*)\[/(c|C)\] 

"これは[c = FFFFFF]白いテキスト[/ c]#黒いテキスト[/ C]です。正規表現のマッチングがあまりにも多く

これは1つのBBコードだけに一致しますが、例のように複数のBBコードが一致すると、両方のBBコードシーケンスの一致(1つの一致)が作成されます。 ([c = FFFFFF] whからto ... ckテキスト[/ C])

なぜこのようなことが起こっていますか?また、どのようにC#で改行をインクルードするには?

+0

"FFFFFFと#000"を一致させたい、または "FFFFFF白テストと#000黒文字" – skyfoot

答えて

3

あなたはそれを行うことができ、ネストされたタグを気にしない場合:

(\[[cC]=)(#?([a-fA-F0-9]{3}){1,2})\](.*?)\[/[cC]\] 
//          ^- lazy match 

あなたは正規表現で、ネストされたタグを処理したい場合は、コードプロジェクトにthis articleをご確認ください。

1

これは、REがgreedyであるために発生します。それは常に可能な限り大きな試合を生み出そうとします。

REエンジンを貪欲にすることは可能です。リンクされたドキュメントで何を試してみるかのヒントを参照してください。

2

オプションをRegexOptions.Singlelinemore on that here)に設定すると、ドットが改行文字と一致します。

0

あなたは[C]タグ

のすべてが、あなたはケースをingnoreためにあなたの正規表現オブジェクトのオプションを設定する必要があり、この

\[c=(#?.*?)\](.*?)\[/c\] or 
\[c=(#?\w*?)\](\w*?)\[/c\] 

を試してみてピックアップしないように怠惰な正規表現を必要としています。

0

正規表現はこれを行うためのすばやい方法です。ここでの解決策は、.*ではなく.*?を使用することです。しかし、より堅牢なソリューションが必要な場合は、おそらく正規表現なしで簡単です。 C#では、ネストされた構造を行うにはがありますが、それは実際には簡単なことではありません。字句解析ツールを使用してDOMを構築する方がよいでしょう。ほとんどの場合、コードは読みやすく、管理しやすくなります。

関連する問題