2015-08-18 2 views
2

Учитывая файл с этим форматомЗаменить со значениями заданной модели в строке

// Colour 
$primary-colour: if(@Model.PrimaryColour, @primaryColour, #afd05c); 
$secondary-colour: if(@secondaryColour, @secondaryColour, #323f47); 
// and so on 

Я пытаюсь заменить @ Model.Whatever, основанный на словарь будет с чем-то вроде этого

var dictionary = new Dictionary<string, string> 
{ 
    {"primaryColour", "blue"}, 
    {"secondaryColour", "red"} 
}; 

Но я изо всех сил пытаюсь найти способ.

Я думал сделать что-то вроде этого:

private static String Replace(String str) 
{ 
    var dictionary = new Dictionary<string, string> 
    { 
     {"primaryColour", "blue"}, 
     {"secondaryColour", "red"} 
    }; 

    string variableValue; 
    string pattern = @"@Model.(?<name>\w)"; 
    dictionary.TryGetValue(FirstCharacterToLower("${name}"), out variableValue); 
    var replacePattern = String.Format("{0}", variableValue); 
    return Regex.Replace(str, pattern, replacePattern, RegexOptions.IgnoreCase); 
} 

private static string FirstCharacterToLower(string str) 
{ 
    Console.WriteLine(str); 
    if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0)) 
     return str; 

    return Char.ToLowerInvariant(str[0]) + str.Substring(1); 
} 

Но что я передаю в FirstCharacterToLower это просто строка {имя}, и я застрял там. Не могу придумать, как это сделать.

Любая идея, куда идти отсюда?

Благодаря

Edit: На основе Sln комментарий Я сделал это, и она работает

using System; 
using System.Text.RegularExpressions; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 

     var input = @" 
      // Colour 
      $primary-colour: if(@Model.PrimaryColour, @Model.PrimaryColour, #afd05c); 
      $secondary-colour: if(@Model.SecondaryColour, @Model.SecondaryColour, #323f47);"; 

     Console.WriteLine(Replace(input)); 
    } 

    private static String Replace(String str) 
    { 
     var dictionary = new Dictionary<string, string> 
     { 
      {"primaryColour", "blue"}, 
      {"secondaryColour", "red"} 
     }; 

     var regex = new Regex(@"@Model\.(?<name>\w+)"); 

     var output = regex.Replace(str, v => 
      { 
       string outVariable; 
       dictionary.TryGetValue(GetNameOfVariable(v.Groups["name"].Value), out outVariable); 
       return outVariable; 
      }); 

     return output; 
    } 

    private static string GetNameOfVariable(string str) 
    { 
     Console.WriteLine(str); 
     if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0)) 
      return str; 

     return Char.ToLowerInvariant(str[0]) + str.Substring(1); 
    } 
} 
+1

'строка шаблон = @ " (? \ W +) @ Модель \";' –

+0

@AvinashRaj, но по-прежнему проходит всего лишь $ {имя} к FirstCharacterToLower, есть ли способ получить доступ к этой именованной группе как к нормальной переменной? – mitomed

+1

Используйте делегат замены. Также неясно, что вы пытаетесь найти. Вам просто нужно создать регулярное выражение, соответствующее любому интересующему вас ключу, замените значение внутри делегата (обратный вызов). – sln

ответ

1

Как сказал @sln, вы должны использовать делегат.

private static String Replace(String str) 
{ 
    var dictionary = new Dictionary<string, string> 
    { 
     {"primaryColour", "blue"}, 
     {"secondaryColour", "red"} 
    }; 

    string pattern = @"@Model\.(?<name>\w+)"; 
    return Regex.Replace(str, pattern, m => 
     { 
      string key = m.Groups["name"].Value; 
      key = FirstCharacterToLower(key); 
      string value = null; 
      if (dictionary.TryGetValue(key, out value)) 
       return value; 
      else 
       return m.Value; 
     }); 
} 
+0

Да, получил почти то же решение, что и в моем редактировании. Но определенно это работает – mitomed

1

Вы бы лучше описывая общее регулярное выражение, которое соответствует всем вашим
ключей. Затем используйте замену делегата.

var dictionary = new Dictionary<string, string> 
{ 
    {"primarycolour", "blue"}, 
    {"secondarycolour", "red"} 
}; 

string line_original = 
@" 
// Colour 
$primary-colour: if(@Model.PrimaryColour, @primaryColour, #afd05c); 
$secondary-colour: if(@secondaryColour, @secondaryColour, #323f47); 
// and so on 
"; 

Regex RxColors = new Regex(@"@Model\.(?<name>\w+)"); 
string line_new = RxColors.Replace(
    line_original, 
    delegate(Match match) 
    { 
     string outVal; 
     if (dictionary.TryGetValue(match.Groups["name"].Value.ToLower(), out outVal)) 
      return outVal; 
     return match.Groups[0].Value; 
    } 
); 
Console.WriteLine("New line: \r\n\r\n{0}", line_new); 

Выход:

New line: 

// Colour 
$primary-colour: if(blue, @primaryColour, #afd05c); 
$secondary-colour: if(@secondaryColour, @secondaryColour, #323f47); 
// and so on 
+0

Спасибо, работал над этим в то же время на основе sln comment – mitomed

Смежные вопросы