2008-09-05 3 views
4

私は助けが必要な正規表現の呼び出しがあります。Regex.Replaceコール中にテキストをエンコードしたい

私は正規表現をここには載せていないので、私はこれを投稿していません。 私ができることをやりたいことは、置き換え中に、正規表現を実行しているテキスト全体でHtml.Encodeを実行して$ {test}部分を修正したいということです。

基本的には、正規表現の範囲内にあるテキスト全体を太字タグで囲むだけでなく、太字タグ内のテキストをHtml.Encodeで囲みます。

RegexOptions regexOptions = RegexOptions.Compiled | RegexOptions.IgnoreCase; 
text = Regex.Replace(text, regexBold, @"<b>${text}</b>", regexOptions); 

答えて

2

Heresこれの実装は、コンテンツから特殊な置換文字列を取り出してローカライズしていました。あなたが交換したいすべてのものを返すので、私はあなたが大胆タグやエンコードコールを持っているでしょうリターンを持っている場合は、鉱山でも、ニーズのための複雑超えるので、少し、再帰をサポートしていますが、あなたの試合の評価デリゲートから

 protected string FindAndTranslateIn(string content) 
     { 
      return Regex.Replace(content, @"\{\^(.+?);(.+?)?}", new MatchEvaluator(TranslateHandler), RegexOptions.IgnoreCase); 
     } 

public string TranslateHandler(Match m) 
{ 
    if (m.Success) 
    { 
     string key = m.Groups[1].Value; 
     key = FindAndTranslateIn(key); 
     string def = string.Empty; 
     if (m.Groups.Count > 2) 
     { 
      def = m.Groups[2].Value; 
      if(def.Length > 1) 
      { 
       def = FindAndTranslateIn(def); 
      } 
     } 

     if (group == null) 
     { 
      return Translate(key, def); 
     } 
     else 
     { 
      return Translate(key, group, def); 
     } 
    } 
    return string.Empty; 
} 

あなたのニーズに合った例を絞り込むことができます。

これは、一致のコレクションに対して反復処理を実行し、replaceメソッドジョブの一部を実行するのと同じです。それはちょうどあなたにいくつかのコードを保存し、あなたはすてきなシャーマンデリゲートを使用するようになる。

3

使用して...この場合にはRegex.Replaceを使用しないでください。..

foreach(Match in Regex.Matches(...)) 
{ 
    //do your stuff here 
} 
0

あなたがRegex.Matchを行う場合は、結果の試合は0番目のインデックスでグループオブジェクトであり、正規表現にマッチしたintputのサブセット

太字のタグでステッチしてエンコードすることができます。

0

{}内のコードを入力して太字のタグを追加し、テキストをエンコードできますか? テキストブロック全体に変更を適用し、最後にテキスト変数のセクションを置き換える方法については混乱します。

4

これを行うには非常に簡単な方法があります(ネット内)。これはMatchEvaluatorと呼ばれ、あらゆる種類のクールな検索と置換を行うことができます。基本的にRegex.Replaceメソッドに、文字列を返すメソッドのメソッド名を渡し、唯一のパラメータとしてMatchオブジェクトを受け取ります。あなたの特定のマッチ(html encode)に意味をなさないものを行い、あなたが返す文字列は入力文字列中のマッチの全テキストを置き換えます。

例:2つの数字が(テキストで)追加されている場所をすべて探して、その式を実際の数字に置き換えたいとします。厳密な正規表現のアプローチではできませんが、MatchEvaluatorをスローすると容易になります。

public void Stuff() 
{ 
    string pattern = @"(?<firstNumber>\d+)\s*(?<operator>[*+-/])\s*(?<secondNumber>\d+)"; 
    string input = "something something 123 + 456 blah blah 100 - 55"; 
    string output = Regex.Replace(input, pattern, MatchMath); 
    //output will be "something something 579 blah blah 45" 
} 

private static string MatchMath(Match match) 
{ 
    try 
    { 
     double first = double.Parse(match.Groups["firstNumber"].Value); 
     double second = double.Parse(match.Groups["secondNumber"].Value); 
     switch (match.Groups["operator"].Value) 
     { 
      case "*": 
       return (first * second).ToString(); 
      case "+": 
       return (first + second).ToString(); 
      case "-": 
       return (first - second).ToString(); 
      case "/": 
       return (first/second).ToString(); 
     } 
    } 
    catch { } 
    return "NaN"; 
} 

よりhttp://msdn.microsoft.com/en-us/library/system.text.regularexpressions.matchevaluator.aspx

をご覧ください
関連する問題