3

DBのフィールドに次のテキストが含まれています。

[quote:5a7b87febe="mr smith"]This is some text.

This is more text on another line.[/quote:5a7b87febe]

上記のようなインスタンスを次のように変換する正規表現を作成しようとしています。

<div><h4>Posted by mr smith</h4>This is some text.

This is more text on another line.</div>

これまでにまとめたパターンは、囲まれたテキストに改行がない場合に機能するように見えますが、別の行にテキストがある上記の例では、パターンが一致していません。

私がこれまでに持っているC#コードは次のとおりです。

var exp = new Regex(@"(\[quote)(:\w+=\"")(.*?)(\""\])(.*?)(\[\/quote)(:\w+\])");
var str = exp.Replace(str, "<div><h4>Posted by $3</h4>$5</div>");

私は正規表現が苦手なので、開始タグと終了タグの間に表示される「任意の」文字の処理方法がわかりません。

理想的には、可能であれば、上記の例のネストされたインスタンスを処理する式も必要です。

もう1つ言及する価値があるのは、「quote:」タグに続く一連の文字は毎回一意であり、引用符内の名前も異なることです。

4

1 に答える 1

5

開始タグの一意の番号と一致させるには、後方参照を使用する必要があります。このようなものがあなたのために働くはずです:

var regex = new Regex(@"\[(quote:[a-z0-9]+)(=""([^""]+)?"")?\](.*)\[/\1\]", RegexOptions.SingleLine);
var str = regex.Replace(str, "<div><h4>Posted by $3</h4>$4</div>");

このソリューションは入力でテストされていますが、ネストされた引用符ではテストされていません。これは少し注意が必要です。

編集:ネストされた引用符でこのソリューションをチェックした後、それは機能します。交換が行われなくなるまで、繰り返し呼び出す必要があります。初めてそれは外側の引用符と一致し、置換の中に内側の引用符をそのまま残します。これを行うためのサンプルコード(テストされていない):

// Repeatedly call this replacement
string last;
do 
{
    last = str;
    str = regex.Replace(str, "<div><h4>Posted by $3</h4>$4</div>");
} while (last != str);
于 2012-06-15T10:29:32.040 に答える