C# 为什么这个正则表达式要插入标记?

C# 为什么这个正则表达式要插入标记?,c#,regex,C#,Regex,我从MSSQL CLR调用了以下函数: private static string ReplaceTags(string input, string TagsReplacementXML) { const string TagNamePattern = @"<\$\w+>"; const string ReplacementPattern = @"<\${0}\>"; XDocument doc = XDocument.Parse(TagsRep

我从MSSQL CLR调用了以下函数:

private static string ReplaceTags(string input, string TagsReplacementXML)
{
    const string TagNamePattern = @"<\$\w+>";
    const string ReplacementPattern = @"<\${0}\>";

    XDocument doc = XDocument.Parse(TagsReplacementXML);
    var xmltags = doc.Descendants("Tag").Select(x => new KeyValuePair<string,string>(x.Attribute("TagName").Value,x.Attribute("TagValue").Value));

    Regex rx = new Regex(TagNamePattern);
    MatchCollection matches;
    matches = rx.Matches(input);
    foreach (Match m in matches)
    {
        KeyValuePair<string, string> tagValues = xmltags.FirstOrDefault(x => string.Format("<${0}>", x.Key) == m.Value);
        if (tagValues.Key != null && tagValues.Value != null)
        {
            input = Regex.Replace(input, string.Format(ReplacementPattern, tagValues.Key), tagValues.Value);
        }
    }
    return input;
}
私有静态字符串替换标记(字符串输入,字符串标记替换XML)
{
常量字符串标记名模式=@“”;
常量字符串替换模式=@“”;
XDocument doc=XDocument.Parse(标记替换XML);
var xmltags=doc.substands(“Tag”)。选择(x=>newkeyvaluepair(x.Attribute(“TagName”).Value,x.Attribute(“TagValue”).Value));
正则表达式rx=新正则表达式(标记名模式);
匹配集合匹配;
匹配=接收匹配(输入);
foreach(匹配中的匹配m)
{
KeyValuePair tagValues=xmltags.FirstOrDefault(x=>string.Format(“,x.Key)==m.Value);
if(tagValues.Key!=null&&tagValues.Value!=null)
{
input=Regex.Replace(input,string.Format(ReplacementPattern,tagValues.Key),tagValues.Value);
}
}
返回输入;
}
我要过去

<$Content>

类似于

<Root>
  <Tag TagName="Content" TagValue="<some (escaped) HTML with>$0.26</some (escaped) HTML>"/>
</Root>

正则表达式将
替换为TagValue中的值,但随后它将返回并将$0替换为
,因此所有低于一美元的价格都显示为.26


首先,我想弄明白它为什么这么做。我有点熟悉正则表达式,但我不知道有什么会导致它。第二件事是我能做些什么来解决这个问题。我曾经考虑过在$0之间插入一个
,这样它们就不会在一起了,但这是非常有技巧的。

你考虑过避开美元符号吗?使用
\$
或HTML实体
#可能会完成任务…我试图避开美元符号,但没有成功。使用HTML实体仍然不能让我只使用string.Format打印货币,但这肯定比输入一个空的跨度要好。@DanPuzey HTML实体最终无法工作,因为它正在编码HTML,然后解码它(因为它是在XML中)。不过,最终还是出现了一条HTML注释。仍在寻找导致它的行为。我相信的行为是,
$0
是插入匹配字符串的正则表达式转义序列-它插入原始字符串中与
标记名模式匹配的部分(
)。