2016-11-23 4 views
0

大きな文字列を操作し、文字列と文字列ビルダーの両方を使用するより良い方法を見つけようとしています。 以下は、文字列を取り、その文字列を正規表現で検索してリンクを見つける関数です。有効なリンクテキストにそれらをラップしたいリンクの出現。私の問題は、私は交換する必要があり、私はメモリの問題を取得している101のリンク値を持つデータベースエントリ(文字列)があります。C#String/StringBuilder MemoryExceptionの大きなセットの置換

このソリューションの方が良い方法がありますか?私はstring.replaceとstringbuilder.replaceの両方にそれを含めていません。

var resultString = new StringBuilder(testb); 
    Regex regx = new Regex(@"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w][email protected])?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w][email protected])[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)", RegexOptions.IgnoreCase); 
    MatchCollection mactches = regx.Matches(txt); 

    foreach (Match match in mactches) 
    { 
     if(match.Value.StartsWith("http://") || match.Value.StartsWith("https://")) 
      fixedurl = match.Value; 
     else 
      fixedurl = "http://" + match.Value; 

     resultString.Replace(match.Value, "<a target='_blank' class='ts-link ui-state-default' href='" + fixedurl + "'>" + match.Value + "</a>"); 
     //testb = testb.Replace(match.Value, "<a target='_blank' class='ts-link ui-state-default' href='" + fixedurl + "'>" + match.Value + "</a>"); 
    } 
+3

私はどこの文字列ビルダーも見ていないし、HTMLパーサーを使用してHTMLを解析しないでも、おそらくこのようにしても全く問題はありません。 ** small ** htmlを投稿して、何をしたいのか説明したら、html agility packでそれを行う方法を教えてください。 – mybirthname

+0

'Regex.Replace()'を単に使うことはできませんか? –

+1

代わりに 'HtmlAgilityPack'を使用します。 –

答えて

0

次のように試すことができます。あなたの特定のケースではより良いパフォーマンスを発揮するかもしれません。

Regex regx = new Regex(@"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w][email protected])?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w][email protected])[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)", RegexOptions.IgnoreCase); 

string resultString = regx.Replace(txt, (match) => 
{ 
    string fixedurl = (match.Value.StartsWith("http://") || match.Value.StartsWith("https://")) 
     ? match.Value 
     : "http://" + match.Value; 

    return "<a target='_blank' class='ts-link ui-state-default' href='" + fixedurl + "'>" + match.Value + "</a>"; 
}); 

EDITED:それは文字列の出現をすべて置き換えるため、

ところで、あなたのコードの問題は、それはおそらく、コードが無限ループに入るように引き起こして、resultString.ReplaceコールのようですOutOfMemoryExceptionにヒットするまで、同じ文字列を何度も何度も置き換えます。

+0

wdosangos、ありがとうございました。私はあなたのコードを見て、今私は何をしているのか、それがループに入るのか、regexを使ってコードを検索して戻り値で置き換える –

関連する問題