2014-10-07 1 views
1

Я пытаюсь заменить вхождения имени свойства значением в словаре в C#.C# RegEx Словарь для замещения строк строки

У меня есть следующий словарь:

Dictionary<string, string> properties = new Dictionary<string, string>() 
{ 
    { "property1", @"E:\" }, 
    { "property2", @"$(property1)\Temp"}, 
    { "property3", @"$(property2)\AnotherSubFolder"} 
}; 

Где ключ является имя свойства, а значение только строковое значение. Я в основном хочу перебирать значения до тех пор, пока все заданные свойства не будут заменены. Синтаксис аналогичен именам свойств MSBuild.

Это должно в конечном итоге оценить свойство 3 на E: \ Temp \ AnotherSubFolder.

Это поможет, если часть функций RegEx будет работать, в которой я застрял.

Я пробовал редактировать мой регек на REFiddle here.

Следующая регулярное выражение шаблон работает здесь:

/\$\(([^)]+)\)/g 

Учитывая текст:

$(property2)\AnotherSubFolder 

Он выделяет $ (свойство2).

Однако, поставив это вместе в .NET скрипку, я не получаю никаких совпадений со следующим кодом:

var pattern = @"\$\(([^)]+)\)/g"; 
Console.WriteLine(Regex.Matches(@"$(property2)AnotherSubFolder", pattern).Count); 

который выводит 0.

Я не слишком уверен, почему здесь. Почему мой матч возвращает нулевые результаты?

+1

Я уверен, что вам нужно удалить «/ г», как .Net не видит, что в качестве переключателя, но и как часть шаблона. – juharr

+0

Кроме того, если вы собираетесь тестировать регулярные выражения, которые хотите использовать в .Net, вы должны обязательно использовать инструмент, который на самом деле использует .Net, например http://regexhero.net/. – juharr

+0

Да хороший человек. «/ G» и первый «/» выглядят как оскорбительные шаблоны. Если я их вытащу, теперь я получу матч. Положите это на ответ, и я приму это. – Andez

ответ

2
  1. По умолчанию стандарт должен соответствовать глобально.
  2. Я не знаю поддержки /g, так как это Perl-ism, поэтому удалите его, а ведущий /, .NET пытается их сопоставить буквально.
+0

«/ g» и первый «/». Просто получил это спасибо! – Andez

+0

Собственно, это не характерно для Perl, но Perl сделал его известным. – codenheim

1

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

Простая замена должна работать:

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; 
+0

Спасибо, что Брэндон. Это может быть излишним, но сейчас это делается. Посмотрим, как это происходит. – Andez

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