无法用包含$ 0的动态字符串替换文本

时间:2018-10-14 21:55:35

标签: c# regex

我正在使用Regex替换模板中的所有字符串。在没有要替换的值$0.00之前,一切工作正常。我似乎无法正确地将$0替换为替换文本。我得到的输出是"Project Cost: [[ProjectCost]].00"。知道为什么吗?

这是带有一些简化变量的代码示例。

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

using System.Security;
using System.Text.RegularExpressions;


namespace Export.Services
{
    public class CommonExportService
    {

        private Dictionary<string, string> _formTokens;


        public CommonExportService() {
         _formTokens =     {{"EstimatedOneTimeProjectCost", "0.00"}};
        }


        private string GetReplacementText(string replacementText)
        {
            replacementText = "Project Cost: [[EstimatedOneTimeProjectCost]]";
            //replacement text = "Project Cost: [[ProjectCost]]"
            foreach (var token in _formTokens)
            {
                var val = token.Value;
                var key = token.Key;

                //work around for now
                //if (val.Equals("$0.00")) {
                //    val = "0.00";
                //}

                var reg = new Regex(Regex.Escape("[[" + key + "]]"));


                if (reg.IsMatch(replacementText))                        
                    replacementText = reg.Replace(replacementText, SecurityElement.Escape(val ?? string.Empty));
                else {

                }
            }

            return replacementText;

            //$0.00 does not replace,  something is happening with the $0 before the decimal  
            //the output becomes Project Cost: [[EstimatedOneTimeProjectCost]].00


            //The output is correct for these
            //0.00 replaces correctly
            //$.00 replaces correctly
            //0 replaces correctly
            //00 replaces correctly
            //$ replaces correctly

        }
    }
}

1 个答案:

答案 0 :(得分:4)

由于替换字符串是动态生成的,因此需要注意其中的$字符。当$后跟0时,$0是对整个匹配的反向引用,因此作为替换的结果插入了整个匹配。

您只需要在文字字符串模式内将$换成美元,就可以了:

return replacementText.replace("$", "$$");

然后,您的替换模式将包含$$0,并将其“转换”为文字$0字符串。