2

Regex.Replace一致したパターンのすべてのオカレンスを置き換えていないように見えるため、C# で問題が発生しています。

private string ReplaceBBCode(string inStr)  
{  
    var outStr = Regex.Replace(inStr, @"\[(b|i|u)\](.*?)\[/\1\]", @"<$1>$2</$1>", RegexOptions.IgnoreCase | RegexOptions.Multiline);  
    outStr = Regex.Replace(outStr, "(\r|\n)+", "<br />"); 
    return outStr; 
}

入力文字列:

[b]Saint Paul's Food Kitchen[/b]    [b]  [/b]Saint Paul's food kitchen opens weekly to provide food to those in need.

結果:

<b>Saint Paul's Food Kitchen</b>    [b]  [/b]Saint Paul's food kitchen opens weekly to provide food to those in need.

私はこれをテストしましたがregexhero.net、そこにあるはずのものとまったく同じように機能します。

編集:
申し訳ありませんが、関数の間違ったバージョンをコピーしました。これで、正しく動作しない正しいコードが表示されます。

4

3 に答える 3

2

私が得ている出力は、あなたが得ていると言っているものとはまったく異なりますが、

私が見る最大の問題は、おそらく正規表現を貪欲にしたくないということです。

に置き換えてみて.*ください.*?

于 2013-05-03T14:47:01.723 に答える
1

これにより問題が解決され、ネストされたタグも処理されます。理由はわかりませんが、何度も再構築してもエラーが発生していました。VS2010 が破損して適切にビルドされていないか、フレームワークが破損している可能性があります。問題の原因が何であるかはわかりませんが、これで解決しました:

private string ReplaceBBCode(string inStr)
{
    var outStr = inStr;
    var bbre = new Regex(@"\[(b|i|u)\](.*?)\[/\1\]", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    while( bbre.IsMatch(outStr))
        outStr = bbre.Replace(outStr, @"<$1>$2</$1>");
    outStr = Regex.Replace(outStr, "(\r|\n)+", "<br />");
    return outStr;
}
于 2013-05-05T12:30:12.723 に答える
1

正規表現は必要ありません:

private static string ReplaceBBCode(string inStr)  
{  
    return inStr.Replace("[b]", "<b>").Replace("[/b]", "</b>")
                .Replace("[i]", "<i>").Replace("[/i]", "</i>")
                .Replace("[u]", "<u>").Replace("[/u]", "</u>")
                .Replace("\r\n", "\n")
                .Replace("\n", "<br />"); 
}

私はこれが好きです:

private static string ReplaceBBCode(string inStr)  
{
    StringBuilder outStr = new StringBuilder();
    bool addBR = false;
    for(int i=0; i<inStr.Length; i++){
        if (addBR){
            outStr.Append("<br />");
            addBR = false;
        }
        if (inStr[i] == '\r' || inStr[i] == '\n'){
            if (!addBR)
                addBR = true;
        }
        else {
            addBR = false;
            if (i+2 < inStr.Length && inStr[i] == '[' 
                && (inStr[i+1] == 'b' ||  inStr[i+1] == 'i' ||  inStr[i+1] == 'u')
                && inStr[i+2] == ']'){
                outStr.Append("<").Append(inStr[i+1]).Append(">");
                i+=2;
            }
            else if(i+3 < inStr.Length && inStr[i] == '[' && inStr[i+1] == '/'
                && (inStr[i+2] == 'b' ||  inStr[i+2] == 'i' ||  inStr[i+2] == 'u')
                && inStr[i+3] == ']'){
                outStr.Append("</").Append(inStr[i+2]).Append(">");
                i+=3;
            }
            else
                outStr.Append(inStr[i]);
        }
    }
    return outStr.ToString();
}
于 2013-05-03T14:48:23.907 に答える