Я пытаюсь заменить вхождения имени свойства значением в словаре в С#.
У меня есть следующий словарь:
Dictionary<string, string> properties = new Dictionary<string, string>()
{
{ "property1", @"E:\" },
{ "property2", @"$(property1)\Temp"},
{ "property3", @"$(property2)\AnotherSubFolder"}
};
Где ключ - это имя свойства, а значение - просто строковое значение. Я в основном хочу перебирать значения до тех пор, пока все заданные свойства не будут заменены. Синтаксис аналогичен именам свойств MSBuild.
Это должно в конечном итоге оценить свойство 3 на E:\Temp\AnotherSubFolder.
Это помогло бы, если бы часть функций RegEx была бы работоспособной, и именно там я застрял.
Я попробовал изменить свой RegEx на REFiddle здесь.
Здесь работает следующий шаблон регулярного выражения:
/\$\(([^)]+)\)/g
Учитывая текст:
$(property2)\AnotherSubFolder
Он выделяет $ (свойство2).
Однако, объединив это в.NET скрипте, я не получаю никаких совпадений со следующим кодом:
var pattern = @"\$\(([^)]+)\)/g";
Console.WriteLine(Regex.Matches(@"$(property2)AnotherSubFolder", pattern).Count);
Какие выходы 0.
Я не слишком уверен, почему здесь. Почему мой матч возвращает нулевые результаты?
/g
поскольку это Perl-ism, поэтому удалите его, а ведущий /
,.NET пытается их сопоставить буквально.Регулярные выражения могут быть переполнены здесь и могут даже вводить проблемы, если ваши свойства или значения содержат специальные символы или символы, которые будут оцениваться как сами регулярные выражения.
Простая замена должна работать:
Dictionary<string, string> properties = new Dictionary<string, string>()
{
{ "property1", @"E:\" },
{ "property2", @"$(property1)\Temp"},
{ "property3", @"$(property2)\AnotherSubFolder"}
};
Dictionary<string, string> newproperties = new Dictionary<string, string>();
// Iterate key value pairs in properties dictionary, evaluate values
foreach ( KeyValuePair<string,string> kvp in properties ) {
string value = kvp.Value;
// Execute replacements on value until no replacements are found
// (Replacement of $(property2) will result in value containing $(property1), must be evaluated again)
bool complete = false;
while (!complete) {
complete = true;
// Look for each replacement token in dictionary value, execute replacement if found
foreach ( string key in properties.Keys ) {
string token = "$(" + key + ")";
if ( value.Contains( token ) ) {
value = value.Replace( "$(" + key + ")", properties[key] );
complete = false;
}
}
}
newproperties[kvp.Key] = value;
}
properties = newproperties;