我正在使用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
}
}
}
答案 0 :(得分:4)
由于替换字符串是动态生成的,因此需要注意其中的$
字符。当$
后跟0
时,$0
是对整个匹配的反向引用,因此作为替换的结果插入了整个匹配。
您只需要在文字字符串模式内将$
换成美元,就可以了:
return replacementText.replace("$", "$$");
然后,您的替换模式将包含$$0
,并将其“转换”为文字$0
字符串。