regex 替换字符串出现的字典

dluptydi  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(133)

我试图用C#中的Dictionary<string,string>中的值替换出现的属性名。
我有以下字典:

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

其中键是属性名,值只是字符串值。我基本上想迭代这些值,直到所有的属性集都被替换。语法类似于MSBuild属性名。
这最终应该将属性3计算为E:\Temp\AnotherSubFolder
如果功能的RegEx部分可以工作,这将有所帮助,这是我坚持的地方。
下面的正则表达式模式在这里工作:

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

鉴于案文:

$(property2)\AnotherSubFolder

它突出显示$(property2)
然而,在.NET fiddle中将其放在一起,我没有得到与以下代码的任何匹配:

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

输出0。
我不太确定为什么在这里。为什么我的匹配返回零个结果?

2fjabf4q

2fjabf4q1#

1..NET默认情况下应全局匹配。
1.我不知道对/g的支持,因为这是一个Perl主义,所以删除它,和领先的/,.NET正试图从字面上匹配它们。

4zcjmb1e

4zcjmb1e2#

正则表达式在这里可能是矫枉过正,如果属性或值包含特殊字符,或者将作为正则表达式本身进行计算的字符,甚至可能会引入问题。
一个简单的替换应该工作:

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;

相关问题