C # RegEx словарь для замены вхождений строки

1

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

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

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.

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

  • 1
    Я почти уверен, что вам нужно удалить «/ g», так как .Net видит это не как переключатель, а как часть шаблона.
  • 0
    Кроме того, если вы собираетесь тестировать регулярные выражения, которые хотите использовать в .Net, вы должны обязательно использовать инструмент, который на самом деле использует .Net, такой как regexhero.net .
Показать ещё 3 комментария
Теги:
dictionary

2 ответа

2
Лучший ответ
  1. По умолчанию глобальный стандарт должен соответствовать стандарту.NET.
  2. Я не знаю поддержки /g поскольку это Perl-ism, поэтому удалите его, а ведущий /,.NET пытается их сопоставить буквально.
  • 0
    «/ Г» и первый «/». Просто получил спасибо!
  • 0
    На самом деле, это не специфично для Perl, но Perl сделал его знаменитым.
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
    Спасибо за это, Брэндон. Это может быть излишним, но это сделано на данный момент. Давайте посмотрим, как это происходит.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню