2016-05-11 15 views
3

指定したパターンに対して複数の一致がある場合とない場合がある文字列があります。複数の正規表現をそれぞれ異なる置換文字に置き換えます。

それぞれを交換する必要があります。

私はこのコードを持っている:

var pattern = @"\$\$\@[a-zA-Z0-9_]*\b"; 
var stringVariableMatches = Regex.Matches(strValue, pattern); 
var sb = new StringBuilder(strValue); 

foreach (Match stringVarMatch in stringVariableMatches) 
{ 
    var stringReplacment = variablesDictionary[stringVarMatch.Value]; 
    sb.Remove(stringVarMatch.Index, stringVarMatch.Length) 
      .Insert(stringVarMatch.Index, stringReplacment); 
} 

return sb.ToString(); 

問題は、私はいくつかの試合を持っているときに最初に交換され、文字列があるときに、他の開始インデックスがそのようにいくつかのケースでは、交換後に変更されていることです

この試合は重いものの、誰かが別の解決策を指摘して別のストリングで複数のマッチを置き換えることができるかどうかを知りたかったのです。

+0

* Regex.Replace:各試合で置き換えてください。ただし、**サウンド**重い*データのサイズは? –

+0

私は考え方を繰り返すためにこのように約100,000の文字列を持っています。それぞれが1〜3個のマッチを持ち、それぞれを別の文字列で置き換えることができます。 – Mortalus

+0

@ LucasTrzesniewski:私はモルタルスは、 'foreach'の中の' Regex.Replace'を使うことはパフォーマンスの殺人者だと思っています。ポイントは 'Regex.Matches'の代わりに' Regex.Replace'を*の代わりに使うことができることです。 –

答えて

7

Regex.Replaceの内側にマッチエバリュエータを使用します。

var pattern = @"\$\$\@[a-zA-Z0-9_]*\b"; 
var stringVariableMatches = Regex.Replace(strValue, pattern, 
     m => variablesDictionary[m.Value]); 

Regex.Replace方法は、すなわち指示されたパターンに一致するすべての非オーバーラップ部分文字列を検索し、見つかった各試合に置き換えられます、グローバル置換を実行します値はvariablesDictionary[m.Value]です。

check if the key exists in the dictionaryには良い考えがあります。

C# demoを参照してください:

using System; 
using System.IO; 
using System.Text.RegularExpressions; 
using System.Collections.Generic; 
using System.Linq; 
public class Test 
{ 
    public static void Main() 
    { 
     var variablesDictionary = new Dictionary<string, string>(); 
     variablesDictionary.Add("[email protected]", "Value"); 
     var pattern = @"\$\[email protected][a-zA-Z0-9_]+\b"; 
     var stringVariableMatches = Regex.Replace("[email protected] and [email protected]", pattern, 
       m => variablesDictionary.ContainsKey(m.Value) ? variablesDictionary[m.Value] : m.Value); 
     Console.WriteLine(stringVariableMatches); 
    } 
} 

出力:[email protected] and Value

+1

ありがとうございます!あなたはそれを行うことができることを知りませんでした! – Mortalus

関連する問題