Учитывая файл с этим форматомЗаменить со значениями заданной модели в строке
// 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);
}
}
'строка шаблон = @ " (? \ W +) @ Модель \";' –
@AvinashRaj, но по-прежнему проходит всего лишь $ {имя} к FirstCharacterToLower, есть ли способ получить доступ к этой именованной группе как к нормальной переменной? – mitomed
Используйте делегат замены. Также неясно, что вы пытаетесь найти. Вам просто нужно создать регулярное выражение, соответствующее любому интересующему вас ключу, замените значение внутри делегата (обратный вызов). – sln