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;
}
通ります
<$Content>
そして似たようなもの
<Root>
<Tag TagName="Content" TagValue="<some (escaped) HTML with>$0.26</some (escaped) HTML>"/>
</Root>
正規表現は、<$Content>
を TagValue にあるものに置き換えますが、戻って $0 を<$Content>
に置き換えるため、1 ドル未満の価格はすべて <$Content> として表示されます.26
まず、なぜそれがそうしているのかを正確に理解しようとしています。私は正規表現にある程度精通していますが、それを引き起こす原因については知りません。2番目のことは、それを回避するために何ができるかです。$ と 0 の間にa を挿入して<span/>
、それらが一緒にならないようにすることを考えましたが、それはかなりハックです。