C#用正規表示式高效替換變數

風靈使發表於2018-08-07

有的時候我們需要進行簡單的字串變數替換. 當然最新的.net已經支援 {name} 這種替換方式. 但是,老的.net是不支援的. 本方法是把“{{varName}}” 這種變數替換成 對應的數值.

例如

Week1 = 星期一
Week2 = 星期二
Week3 = 星期三
Week4 = 星期四
“今天是{{Week1}}, 明天是{{Week2}}

替換結果

“今天是星期一, 明天是星期二”

下面是程式碼

        /// <summary>
        /// 會自動替換 變數   把形如 "{{varName}}" 替換成對應的數值
        /// </summary>
        public static void ReplaceFileVar(string srcFile, string targetFile)
        { 
            /*
            * 設定webconfig連線字串
            */
            string webconfigpath = Path.Combine("./", srcFile);
            //修改第一個資料庫連線
            string webcofnigstring2 = File.ReadAllText(webconfigpath);

            webcofnigstring2 = ReplaceStringVar(webcofnigstring2);

            //迴圈替換所有的 {{DBSERVER}} 這種變數 效率比較低,改成上面的replace
            //foreach (Match item in mat)
            //{
            //    Console.WriteLine(item.Groups[1]);
            //    var name = item.Groups[1].Value;
            //    if (! string.IsNullOrEmpty( InstallContext.Get(name)))
            //    {
            //         webcofnigstring2.Replace(@"{{"+ name + "}}", InstallContext.Get(name));
            //    }
            //}

            File.WriteAllText(targetFile, webcofnigstring2);
        }


        /// <summary>
        /// 會自動替換 變數   把形如 "{{varName}}" 替換成對應的數值
        /// </summary>
        private static string ReplaceStringVar(string str)
        {
            Regex reg = new Regex(@"\{\{(.*?)\}\}");
            //var mat = reg.Matches(webcofnigstring2);

            str = reg.Replace(str,
                new MatchEvaluator(m =>
                     InstallContext.Get(m.Groups[1].Value) == string.Empty ? m.Value : InstallContext.Get(m.Groups[1].Value)
                ));
            return str;
        }

InstallContext.cs 順便也貼一下

public static class InstallContext  
{
    private static Dictionary<string, string> kvs = new Dictionary<string,string> ();
    public static string Get(string index) 
    {
        if (kvs.ContainsKey(index)) 
        {
            return kvs[index];
        } else 
        {
            return string.Empty;
        }
    }
    public static void Set(string index, string value) 
    {
        kvs[index] = value;
    }
    //private static InstallContext instance = new InstallContext();
    //private InstallContext()
    //{
    //}
    //public static InstallContext GetInstance()
    //{ 
    //    return instance;
    //}
}

下面是使用方法

        private void button3_Click(object sender, EventArgs e)
        { 
            InstallContext.Set("WebSiteDBConnectstring",textBox1.Text);
            ReplaceFileVar("Web.config.tpl","Web.config"); 
        }

Web.config.tpl 檔案內容

<?xml version="1.0"?>
<configuration>
{{WebSiteDBConnectstring}}
</configuration>

相關文章