2012-01-04 10 views
1

何度もチェックしたり変更したりするために、(異なるシーケンスを検索して置き換える)1つのストリングが必要ですが、うまく機能しません。私は不変性のためにその推測する。ルーピングスルーストリング - 不変性の問題

private string DoRegexCheck(string line) 
{ 
    string pattern; 

    foreach (string re in this.regexPatterns.Items) 
    { 
    pattern = re; 
    Regex r = new Regex(pattern, RegexOptions.IgnoreCase); 
    line=r.Replace(line, ""); //the line should be updated and the check should continue with updated line 
    }        

    return line; 
} 
+0

奇妙なことに、うまくいくはずです。不変性は問題ではありません: 'Regex.Replace'は' line'変数に代入される**新しい** stringインスタンスを作成します。 *それはうまくいかない*あなたは何を意味しますか?どうしましたか? –

+0

@Pavel Gatilov:シーケンスを置き換えるだけではなく、1つずつ試してみるとうまくいきました。 – user970696

+0

"私の行が変わっていない"という場合は、単純に:あなたの正規表現のパターンは間違っています。行を更新するコードは正常です。再現するために使用できる実際のサンプルデータ(サンプルの 'line')、いくつかのサンプルパターン、希望/実際の出力を表示してください。 –

答えて

2

「うまくいきません」と多少曖昧です。

あなたは「それはlineを変更されていない意味場合 - そのコードは大丈夫です、我々が示すように、コードをしようとしない新しい文字列の各Replace(に変更されているので不変性は、全く問題ではありません。 。期待どおりに更新されていない場合は、お使いのRegexパターンは単に間違っている)既存の文字列を編集


パフォーマンスを意味する場合:あなたは、文字列のRegex作品方法を変更することはできません。私が考え、。しかし、Compiledオプションを使用してさまざまな正規表現をキャッシュすることをお勧めします。そうすれば、配列や辞書を事前にコンパイルすることができますd Regexを再利用してください。これは何千ものlineに適用する場合に特に重要です。

+0

私はちょうど文字列「線」が本当に必要なことを知っています各反復で更新されます。私は、正規表現があるかどうかは問題ではないと思います。アクションを変更する他の文字列と同じになります。反対に、 – user970696

+0

@ user970696; 'Regex.Replace' *のそれぞれが' string'と 'return'を(たぶん異なった)' string'を取りますので、 'Regex'は非常に重要です。他のAPIの中には 'char *'や 'StringBuilder'を使うものがあります。 「正規表現」はそうではありません。しかし、「文字列」不変性が問題であると結論づけるのは早すぎると思います。症状は何ですか?あなたが私達に語ったことは、「うまくいかない」ということだけです。パフォーマンスを意味するなら、あらかじめコンパイルすることなくそれらの 'Regex'を処理するオーバーヘッドは' string'不変性よりもはるかに大きいはずです。最初に修正してください。 –